Как правильно написать параметризованную команду вставки в ADO с помощью C ++ - PullRequest
0 голосов
/ 05 апреля 2019

Я использую 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
...