在使用参数数组插入/更新期间,可以忽略一个/某些特定行的一个/某些参数。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文档(扩展指标):
- http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.odbc%2Fsrc%2Ftpc%2Fdb2z_afarinp.htm
- http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2z10.doc.odbc%2Fsrc%2Ftpc%2Fdb2z_fnbindparameter.htm
“ODBC应用程序可以使用扩展指标更新UPDATE,INSERT和MERGE语句中的所有列都没有指定ng不需要更改的列的当前值。
如果您使用扩展指标,你不需要的代码,你要插入“
SQL_UNASSIGNED:”为列的每个组合单独的INSERT语句中绑定参数的目标列的UPDATE忽略,MERGE更新操作。该参数的处理方式为插入默认的关键字相同,和MERGE INSERT操作。”
这可能与本机客户端?在微软的文档不会出现SQL_UNASSIGNED任何引用。提前
谢谢。
事实上,在这种情况下,我们至少有4个客户端 - 服务器网络往返。 1往返第一次准备, 1往返执行, 1往返第二次准备, 1往返执行。 我想避免最后2次往返:) – dim
@dim正如我从“..in row#60 parameter ..”中理解的那样,无论如何多次启动语句,让我只是提到两个语句将在相同连接。如果您对网络往返有疑问,那么您应该使用存储过程 - 在此区分X是否应该用作参数 – Dewfy
好吧,这是一种可能性,但最好避免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