在執行階段建構 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 陳述式的時間通常很少。