【发布时间】:2014-02-04 04:47:00
【问题描述】:
我必须执行多个 INSERT 查询,我希望重用一个 Command 对象,而不是为我拥有的每个查询创建一个新对象。
为了更好地说明这一点,这里有一个伪代码:
ADODB::_CommandPtr pCmd("ADODB.Command");
pCmd->ActiveConnection = pConn;
pCmd->CommandText = L"INSERT INTO MyTable ( field1, field2 ) VALUES (?,?);";
pCmd->Parameters->Append( pCmd->CreateParameter( "?", ADODB::adVarWChar,
ADODB::adParamInput, wcslen( myString ), myString ) );
pCmd->Parameters->Append( pCmd->CreateParameter( "?", ADODB::adDouble,
ADODB::adParamInput, sizeof(double),
_wtof_l( myDouble, _get_current_locale() ) ) );
pCmd->Execute( NULL, NULL, ADODB::adCmdText );
// empty parameters collection->the problematic part
/**** execute second query **************/
pCmd->CommandText = //some other query
// and do basically the same as above:
// append some parameters and execute query
我不知道如何从Parameters 集合中删除所有参数,以便我可以将Command 对象重用于另一个SQL 查询。
由于缺乏经验,我尝试在互联网上找到解决方案,并找到了一些关于如何做到这一点的建议。这是我的尝试:
do
{
pCmd->Parameters->Delete(0);
}
while( pCmd->Parameters->GetCount() > 0 );
但是失败了。我也试过这个:
for( long i = 0; i < pCmd->Parameters->GetCount(); i++ )
pCmd->Parameters->Delete(i);
但这也失败了。
如何正确清空 Parameters 集合以便重用 Command 对象?
谢谢。
最好的问候。
【问题讨论】:
-
首先,如果您的参数设置相同,则没有理由完全清空它们。您可以在下一组查询值中重用它们。此外,您应该使用当前代码将
pCmd->CommandType设置为ADODB::adCmdText,并且您的查询中缺少一个值参数(VALUES列表中有两个,但参数中只有一个“?”列表)。唉,回到你的问题,没有.Reset()子句像很多 MS 集合中那样。您显示的第一个选项应该有效。我不推荐第二个,老实说,除非您有需要,否则根本不会这样做。 -
您知道如何在附加到参数集合时保留直接参数对象引用,以便以后可以将它们重用于另一个查询吗?如果可能的话,如果它适合适合您的模型,请务必这样做,如果需要,我会告诉您如何操作。
-
@WhozCraig:我的其他查询有不同的参数类型,它们的数量也不同。在我的帖子中,我只是做了一个小例子。我已经更正了错字并添加了您建议的代码 sn-p-谢谢您的更正。我没有经验,不知道怎么做你说的。我希望我的问题足够清楚,尽管您或其他人可以回答。谢谢你。最好的问候。
-
如果您的参数不同,老实说,通过重用相同的命令对象,您几乎一无所获。如果我是你,我会简单地使用不同的
ADODB::_Command对象。 (我已经写了一个 freak-ton 的 ADODB 非 .NET 代码,所以值得一试)。 -
是的,每个查询都有不同的命令对象。因此,有线时间、服务器时间和数据传输时间最终将是相同的。有 分钟 数量的新命令对象的客户端设置,但它们便宜。我希望 MS 会在参数集合上提供本机
Reset()或Clear(),就像他们在许多其他非 ADO 上一样,但可惜,他们没有。祝你好运。