Эффективный способ вставить одну запись с помощью ADO - PullRequest
1 голос
/ 06 августа 2010

ОК, это должно быть просто.Я только начал использовать ADO в C ++ и пытаюсь найти лучший способ вставить запись.

В данный момент я создаю новый набор записей и открываю его с помощью Open (),но кажется странным использовать ADODB :: adCmdTable, потому что, насколько я понимаю, он делает выбор *.Есть ли лучший вариант здесь?

Кроме того, кажется странным, что нужно передать строку соединения, а не объект соединения, который у меня уже есть ...

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 ]

1 голос
/ 06 августа 2010

А как насчет простой команды:

   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

0 голосов
/ 26 августа 2010

Очевидно, он не делает выбор * ... по крайней мере, количество записей в наборе записей равно 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);
...