共用方式為


在執行階段建構 SQL 陳述式

執行臨機操作分析的應用程式,通常會在執行階段建置 SQL 陳述式。 例如,試算表可能會允許使用者選取要擷取資料的資料行:

// SQL_Statements_Constructed_at_Run_Time.cpp  
#include <windows.h>  
#include <stdio.h>  
#include <sqltypes.h>  
  
int main() {  
   SQLCHAR *Statement = 0, *TableName = 0;  
   SQLCHAR **TableNamesArray, **ColumnNamesArray = 0;  
   BOOL *ColumnSelectedArray = 0;  
   BOOL  CommaNeeded;  
   SQLSMALLINT i = 0, NumColumns = 0;  
  
   // Use SQLTables to build a list of tables (TableNamesArray[]). Let the  
   // user select a table and store the selected table in TableName.  
  
   // Use SQLColumns to build a list of the columns in the selected table  
   // (ColumnNamesArray). Set NumColumns to the number of columns in the  
   // table. Let the user select one or more columns and flag these columns  
   // in ColumnSelectedArray[].  
  
   // Build a SELECT statement from the selected columns.  
   CommaNeeded = FALSE;  
   Statement = (SQLCHAR*)malloc(8);  
   strcpy_s((char*)Statement, 8, "SELECT ");  
  
   for (i = 0 ; i = NumColumns ; i++) {  
      if (ColumnSelectedArray[i]) {  
         if (CommaNeeded)  
            strcat_s((char*)Statement, sizeof(Statement), ",");  
         else  
            CommaNeeded = TRUE;  
         strcat_s((char*)Statement, sizeof(Statement), (char*)ColumnNamesArray[i]);  
      }  
   }  
  
   strcat_s((char*)Statement, 15, " FROM ");  
   // strcat_s((char*)Statement, 100, (char*)TableName);  
  
   // Execute the statement . It will be executed once, do not prepare it.  
   // SQLExecDirect(hstmt, Statement, SQL_NTS);  
}  

通常在執行階段建構 SQL 陳述式的另一個應用程式類別,則是應用程式開發環境。 但在這些開發環境所建置的應用程式中,陳述式會建構為硬式編碼,且通常可進行最佳化和測試。

當應用程式在執行階段建構 SQL 陳述式,便可提供使用者極高的彈性。 如上述範例所示,WHERE 子句、ORDER BY 子句或聯結等常見作業甚至不受支援,在執行階段建構 SQL 陳述式遠比硬式編碼陳述式更為複雜。 此外,在測試這類應用程式時也有問題,因為這些應用程式可建構任意數目的 SQL 陳述式。

建構陳述式所需的時間遠超過使用硬式編碼的陳述式,這是在執行階段建構 SQL 陳述式的潛在缺點。 幸虧這一點幾乎不成困擾。 這類應用程式通常需要大量操作使用者介面,且相較於使用者輸入準則的時間,應用程式花費在建構 SQL 陳述式的時間通常很少。