TADOCommand, параметрический запрос

Кифирчик
Дата: 08.07.2009 09:58:44
есть кусок кода, переменные передаю параметром
      cmd := TADOCommand.Create(nil);
      cmd.Connection := conn;
      try
        cmd.CommandText
          :=' UPDATE addr_book SET                       ' +
            '    addr_name         = :addr_name        , ' +
            '    addr_short_name   = :addr_short_name  , ' +
            '    addr_email        = :addr_email       , ' +
            '    addr_tel          = :addr_tel         , ' +
            ...
            ' WHERE addr_id     = '+IntToStr(addr_id);
        cmd.Parameters.CreateParameter('addr_name'      ,ftString,pdInput,255,  edtAddrName.Text        );
        cmd.Parameters.CreateParameter('addr_short_name',ftString,pdInput,255,  edtAddrShortName.Text   );
        cmd.Parameters.CreateParameter('addr_email'     ,ftString,pdInput,255,  edtAddrEMail.Text       );
        cmd.Parameters.CreateParameter('addr_tel'       ,ftString,pdInput,255,  edtAddrTel.Text         );
        ...

        cmd.Execute;
      finally
        cmd.Free;
      end;
после выполнения, зачищаются все строки, будто вместо параметров передаются nil.
аналогичное с TADOStoredProc и TADODataSet проходит на ура...
сейчас вот сделал с TADOCommand и такая вот попа (
что я делаю не так?
база - Access, провайдер данных Jet
Ega
Дата: 08.07.2009 10:04:36
1. ParamCheck := False поставь.
2. "Во избежание" замени так:

       cmd.CommandText
          :=' UPDATE addr_book SET                       ' +
            '    addr_name         = ?, ' +
            '    addr_short_name   = ?, ' +
            '    addr_email        = ?, ' +
            '    addr_tel          = ?, ' +
3. параметры создавай именно в том порядке, как '?' идут.
4. Connection лучше присваивать после создания параметров.
RENaissance
Дата: 08.07.2009 10:05:16

А если так?
       cmd := TADOCommand.Create(nil);
       cmd.Connection := conn;
       try
         cmd.CommandText
           :=' UPDATE addr_book SET                       ' +
             '    addr_name         = :addr_name        , ' +
             '    addr_short_name   = :addr_short_name  , ' +
             '    addr_email        = :addr_email       , ' +
             '    addr_tel          = :addr_tel         , ' +
             ...
             ' WHERE addr_id     = '+IntToStr(addr_id);
         cmd.Parameters.Refresh();
         cmd.Parameters.ParamByName(...);
         ...

         cmd.Execute;
       finally
         cmd.Free;
       end;

Posted via ActualForum NNTP Server 1.4

RENaissance
Дата: 08.07.2009 10:06:27

Ega, откуда такая уверенность по 2-му и 4-му пунктам?

Posted via ActualForum NNTP Server 1.4

Anatoly Podgoretsky
Дата: 08.07.2009 10:08:41
Попробуй выбросить эти строки
       cmd.Parameters.CreateParameter('addr_name'      ,ftString,pdInput,255,  edtAddrName.Text        );
        cmd.Parameters.CreateParameter('addr_short_name',ftString,pdInput,255,  edtAddrShortName.Text   );
        cmd.Parameters.CreateParameter('addr_email'     ,ftString,pdInput,255,  edtAddrEMail.Text       );
        cmd.Parameters.CreateParameter('addr_tel'       ,ftString,pdInput,255,  edtAddrTel.Text         );
и заменить их на последовательность такого вида
cmd.Parameters.ParamByName('addr_email').Value := edtAddrEMail.Text;
и также выбросить это
' WHERE addr_id     = '+IntToStr(addr_id);
Ну и конечно дикое предположение, что меняешь для ИД=х, а смотришь для другого ИД


--
http://www.podgoretsky.com
Anatoly Podgoretsky
Дата: 08.07.2009 10:12:45
"И также" далее по тексту к делу не относится, не обращать внимание

--
http://www.podgoretsky.com
Ega
Дата: 08.07.2009 10:16:50
RENaissance

Ega, откуда такая уверенность по 2-му и 4-му пунктам?


По пункту 2 - вообще-то это ADO-шная форма записи. Т.е., по-идее, так идеологически правильнее.
По пункту 4 - при заданном коннекте, когда CommandText меняешь, эта падла в INFORMATION_SCHEMA лезет.
RENaissance
Дата: 08.07.2009 10:21:08

Ega

По пункту 4 - при заданном коннекте, когда CommandText меняешь, эта
падла в INFORMATION_SCHEMA лезет.

Все правильно. У меня нет желания вручную описывать параметры.

З.Ы Сильно напрягает, что ADO выбирает необходимые данные из INFORMATION_SCHEMA?

Posted via ActualForum NNTP Server 1.4

RENaissance
Дата: 08.07.2009 10:22:18

Ega

По пункту 2 - вообще-то это ADO-шная форма записи. Т.е., по-идее, так
идеологически правильнее.

У Борланда параметры принято обозначать двоеточием.

Posted via ActualForum NNTP Server 1.4

Anatoly Podgoretsky
Дата: 08.07.2009 10:22:53
По пункту два, это классическая форма записи, а с именоваными параметрами это форма Дельфи и при посылке запроса, заменяется на знаки вопроса.

--
http://www.podgoretsky.com