如何使用C ++在ADO中正确编写参数化的插入命令

时间:2019-04-05 15:02:34

标签: c++ sql sql-server com ado

我正在使用ado来连接数据库。我已经导入了“ msado15.dll”。我想将数据插入SQL Server。我使用参数,但出现错误,提示DB_E_ERRORSOCCURRED Multiple-step OLE DB operation generated errors. Check each OLE DB status value, if available. No work was done.。但是如果我不使用参数(这是不建议使用sql注入的原因),它将起作用。(请参见下面的代码) 此参数代码是否正确编写?还是应该导入另一个“ msadox.dll”,因为我在某处读取了该信息。谢谢您。

_ParameterPtr NameParam, AccIDParam, BalParam;
VARIANT vLoginType;
VARIANT vNameType;
VARIANT vBalanceType;
for (int i = 0; i < size; i++)
{
    int DataExistCounter = 0;

    a[i].login;
    a[i].name;
    a[i].leverage;
    a[i].balance;
    a[i].group;
//_bstr_t InsertQuery("Insert Into personal(AccountID, Balance) Values(" + _bstr_t(a[i].login) + ","  + _bstr_t(a[i].balance) + ")"); //this works

_bstr_t InsertQuery("Insert Into personal(AccountID, Name, Balance) Values(@AccountID, @Name, @Balance)");

pCommand->CommandText = InsertQuery;
pCommand->ActiveConnection = pConnection;
pCommand->CommandType = adCmdText;

vLoginType.vt = VT_I4;
vLoginType.intVal = a[i].login;
vNameType.vt = VT_BSTR; //VT_CARRAY p.s name is char type, idk vt_carray would be better or vt_bstr
vNameType.cyVal = _bstr_t(a[i].name);
vBalanceType.vt = VT_R8;
vBalanceType.dblVal = a[i].balance;

AccIDParam = pCommand->CreateParameter(_bstr_t("@AccountID"), adInteger, adParamInput, sizeof(int), _bstr_t(vLoginType));
pCommand->Parameters->Append((IDispatch*)AccIDParam);

NameParam = pCommand->CreateParameter(("@Name"), adVarWChar, adParamInput, 128, vNameType);
pCommand->Parameters->Append((IDispatch*)NameParam);

BalParam = pCommand->CreateParameter(_bstr_t("@Balance"), adDouble, adParamInput, sizeof(double), _bstr_t(vBalanceType));
pCommand->Parameters->Append((IDispatch*)BalParam);


pRecordset->MoveFirst();
while (!pRecordset->EndOfFile)
{
    valFieldNam = pRecordset->Fields->GetItem("Name")->Value;
    valFieldAcc = pRecordset->Fields->GetItem("AccountID")->Value;
    valFieldBal = pRecordset->Fields->GetItem("Balance")->Value;


    if (valFieldAcc == a[i].login)
    {
        DataExistCounter++;
    }
    pRecordset->MoveNext();
}
if (DataExistCounter > 0)
{
    //update
}
else
{
    pCommand->Execute(NULL, NULL, adExecuteNoRecords);
    //pConnection->Execute(InsertQuery, NULL, adCmdText);
}

 }
//closing recordest and connection

0 个答案:

没有答案