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