2013-01-17 59 views
1

在使用參數數組插入/更新期間,可以忽略一個/某些特定行的一個/某些參數。ODBC:參數數組 - 忽略參數

我提供了一個簡單的例子。假設我們有一個表3列:X,Y和Z.我們希望塊進行更新(請忽略如果某些參數丟失,這是不相關的討論):

#define N_ROWS_PER_BLOCK 100 
int h_x[N_ROWS_PER_BLOCK]; 
int h_y[N_ROWS_PER_BLOCK]; 
int h_z[N_ROWS_PER_BLOCK]; 

// Fill h_x, h_y and h_z with the values that we want - doesn't matter to this question 
// (...) 
strexec = "UPDATE table SET X = ?, Y = ?, Z = ?" 

SQLBindParameter(stmt_handle, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_x, 0, NULL); 
SQLBindParameter(stmt_handle, 2, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_y, 0, NULL); 
SQLBindParameter(stmt_handle, 1, SQL_PARAM_INPUT, SQL_C_SLONG, SQL_INTEGER, 0, h_z, 0, NULL); 

SQLSetStmtAttr(stmt_handle, SQL_ATTR_PARAMSET_SIZE, (SQLPOINTER)N_ROWS_PER_BLOCK, 0); 
SQLExecDirectA (stmt_handle, (SQLCHAR*)strexec , SQL_NTS); 

問題:現在想象一下,出於某種原因,我們希望在行#60中參數X應該是忽略在語句執行中。這樣做的好處是我們可以編寫一個帶有「所有列/屬性」的語句,並只更新每行所需的屬性/列。

如果可能,我該怎麼做?我可以指向一些(虛擬)例子嗎?

我讀ODBC文檔我,知道可能忽略一個(完整)行使用SQL_ATTR_PARAM_OPERATION_PTR屬性和設置SQL_PARAM_PROCEED或SQL_PARAM_IGNORED(一組參數),但我不想忽略的所有屬性行,只是行的一個參數。

編輯:

,我發現這個在IBM ODBC文檔(擴展指標):

「ODBC應用程序可以使用擴展指標更新UPDATE,INSERT和MERGE語句中的所有列都沒有指定ng不需要更改的列的當前值。

如果您使用擴展指標,你不需要的代碼,你要插入「

SQL_UNASSIGNED:」爲列的每個組合單獨的INSERT語句中綁定參數的目標列的UPDATE忽略,MERGE更新操作。該參數的處理方式爲插入默認的關鍵字相同,和MERGE INSERT操作。」

這可能與本機客戶端?在微軟的文檔不會出現SQL_UNASSIGNED任何引用。提前

謝謝。

回答

0

您可以創建並準備2個語句:

strexec1 = "UPDATE table SET X = ?, Y = ?, Z = ?"; 
strexec2 = "UPDATE table SET Y = ?, Z = ?" 

然後,只需選擇什麼樣的聲明應該以分批執行

+0

事實上,在這種情況下,我們至少有4個客戶端 - 服務器網絡往返。 1往返第一次準備, 1往返執行, 1往返第二次準備, 1往返執行。 我想避免最後2次往返:) – dim

+0

@dim正如我從「..in row#60 parameter ..」中理解的那樣,無論如何多次啓動語句,讓我只是提到兩個語句將在相同連接。如果您對網絡往返有疑問,那麼您應該使用存儲過程 - 在此區分X是否應該用作參數 – Dewfy

+0

好吧,這是一種可能性,但最好避免2次單獨更新。我不希望一次更新只更新第60行的Y和Z列......我更喜歡用另一種方法來更新X,Y和Z(只使用一次執行)並忽略第60行中的參數X. 例如: h_x [59] = 11; h_y [59] = 11; h_z [59] = 11; h_x [60] =不要關心! ; h_y [60] = 12; h_z [60] = 12; h_x [61] = 12; h_y [61] = 12; h_z [61] = 12; //綁定X參數,Y參數和Z參數 //執行 並且執行後,<行60,列x>未更新,因爲我想忽略它。 – dim