【问题标题】:An efficient way to insert a single record using ADO使用 ADO 插入单个记录的有效方法
【发布时间】:2010-08-26 22:16:58
【问题描述】:

好的,这应该很简单。我刚刚开始在 C++ 中使用 ADO,我正在尝试找出插入记录的最佳方法。

目前我正在创建一个新的 Recordset 并使用 Open() 打开它,但使用 ADODB::adCmdTable 似乎很奇怪,因为我的理解是它会执行 select *.这里有更好的选择吗?

此外,必须传入连接字符串而不是我已经放置的连接对象似乎很奇怪......

ADODB::_RecordsetPtr prs = NULL;
HRESULT hr = prs.CreateInstance(__uuidof(ADODB::Recordset));
if(!FAILED(hr))
{
  const _variant_t vconn = acpAdoConnection->ConnectionString;
  prs->Open(
    table.c_str(), 
    vconn, 
    ADODB::adOpenUnspecified, 
    ADODB::adLockOptimistic, 
    ADODB::adCmdTable);
  prs->AddNew(fields, values);
}

那么使用 ADO 插入单个记录的更好方法是什么?

【问题讨论】:

    标签: c++ ado


    【解决方案1】:

    一个简单的命令怎么样:

       Conn1.CreateInstance( __uuidof( ADODB::Connection ) );
       Conn1->ConnectionString = ....;
       Conn1->Open( .... );
    
    
       // Drop procedure, if it exists & recreate it.
       Conn1->Execute( "put update query here", ADODB::adCmdText);
    

    这是一个例子:http://support.microsoft.com/kb/185125

    【讨论】:

    • 好吧,我认为将变体交给 ADO 库而不是对我的所有值进行字符串化会更好(更快且更少依赖数据库)。我认为还有另外几个原因,但目前还没有想到。
    【解决方案2】:

    显然它没有执行 select * ... 至少记录集上的记录数是 0。

    您实际上可以将连接对象作为 IDispatch* 传递,而不是传递连接字符串,它会变成一个变体。所以更好的处理方式可能是这样(跳过 HRESULT 的检查):

    ADODB::_RecordsetPtr prs = NULL;
    HRESULT hr = prs.CreateInstance(__uuidof(ADODB::Recordset));
    prs->Open(
        table.c_str(), 
        _variant_t((IDispatch *) acpAdoConnection),
        ADODB::adOpenUnspecified, 
        ADODB::adLockOptimistic, 
        ADODB::adCmdText);
    prs->AddNew(fields, values);
    

    【讨论】:

    • 我不能确定它不会选择 *... 我遇到了这个问题,因为我已经接管了一个经典的 ASP 站点,它使用 ADO addnew 和 .打开“tablename”确实(根据 SQL Server Profiler”)确实执行了“select * from tablename”,并且返回所需的时间证实了这一点...... :(
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-04-03
    • 2014-05-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-18
    相关资源
    最近更新 更多