【问题标题】:Properly reuse ADODB command object to execute multiple queries正确重用 ADODB 命令对象来执行多个查询
【发布时间】: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-&gt;CommandType 设置为ADODB::adCmdText,并且您的查询中缺少一个值参数(VALUES 列表中有两个,但参数中只有一个“?”列表)。唉,回到你的问题,没有.Reset() 子句像很多 MS 集合中那样。您显示的第一个选项应该有效。我不推荐第二个,老实说,除非您有需要,否则根本不会这样做。
  • 您知道如何在附加到参数集合时保留直接参数对象引用,以便以后可以将它们重用于另一个查询吗?如果可能的话,如果它适合适合您的模型,请务必这样做,如果需要,我会告诉您如何操作。
  • @WhozCraig:我的其他查询有不同的参数类型,它们的数量也不同。在我的帖子中,我只是做了一个小例子。我已经更正了错字并添加了您建议的代码 sn-p-谢谢您的更正。我没有经验,不知道怎么做你说的。我希望我的问题足够清楚,尽管您或其他人可以回答。谢谢你。最好的问候。
  • 如果您的参数不同,老实说,通过重用相同的命令对象,您几乎一无所获。如果我是你,我会简单地使用不同的 ADODB::_Command 对象。 (我已经写了一个 freak-ton 的 ADODB 非 .NET 代码,所以值得一试)。
  • 是的,每个查询都有不同的命令对象。因此,有线时间、服务器时间和数据传输时间最终将是相同的。有 分钟 数量的新命令对象的客户端设置,但它们便宜。我希望 MS 会在参数集合上提供本机 Reset()Clear(),就像他们在许多其他非 ADO 上一样,但可惜,他们没有。祝你好运。

标签: c++ ado


【解决方案1】:

更好地查看来自 Internet 的示例,我设法弄清楚了这一点。关键是像这样从头到尾删除参数

for( long i = pCmd->Parameters->GetCount()-1; i >= 0; i-- ) 
    pCmd->Parameters->Delete(i);

或者像这样:

do
{ 
    pCmd->Parameters->Delete( pCmd->Parameters->GetCount()-1 ); 
}
while( pCmd->Parameters->GetCount()-1 >= 0 );

我仍将遵循成员 WhozCraig 的建议,为每个查询创建新的 Command 对象。

再次感谢 WhozCraig 并在下次再见!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-04-17
    • 1970-01-01
    • 1970-01-01
    • 2014-06-13
    • 1970-01-01
    相关资源
    最近更新 更多