使用ADO插入单个记录的有效方法

时间:2010-08-05 22:38:41

标签: c++ ado

好的,这应该很简单。我刚刚开始在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插入单个记录的更好方法是什么?

2 个答案:

答案 0 :(得分: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

答案 1 :(得分:0)

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

您可以将连接对象实际传递为IDispatch *,而不是传递连接字符串,而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);