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

Petro123
Дата: 08.07.2009 10:24:02
RENaissance

Ega

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

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

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

+2
Ega
Дата: 08.07.2009 10:25:00
RENaissance
Все правильно. У меня нет желания вручную описывать параметры.
З.Ы Сильно напрягает, что ADO выбирает необходимые данные из INFORMATION_SCHEMA?


Так автор-то их описывает. Либо ParamCheck:=True и не заморачиваться, либо создавать всё аккуратно ручками, прописывая все типы.
В случае с MSSQL и Access скорее всего проблем не будет. А вот с Postgres-ом я однажды накололся с параметрами, причём очень сильно.
Ega
Дата: 08.07.2009 10:26:24
RENaissance

Ega

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

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


Один фиг на знаки вопроса заменит, просто при парсинге сразу ParamName задаст, только и всего.
Anatoly Podgoretsky
Дата: 08.07.2009 10:26:39
Проблемы могут быть, с Юникодом, но это обнаруживается на стадии проектирования.

--
http://www.podgoretsky.com
Petro123
Дата: 08.07.2009 10:33:04
Ega

В случае с MSSQL и Access скорее всего проблем не будет. А вот с Postgres-ом я однажды накололся с параметрами, причём очень сильно.

в каждом конкретном случае надо разбираться индивидуально.
Это не значит, что нужно АвтоКод заменять ручным самописным.
Ega
Дата: 08.07.2009 10:43:30
Petro123
в каждом конкретном случае надо разбираться индивидуально.


Согласен.

Petro123
Это не значит, что нужно АвтоКод заменять ручным самописным.


Ты знаешь, это уже дело привычки. Как наш старшина говорил: "В армии всё может быть безобразно, зато - единообразно". Однажды сильно наколовшись, я уже на автомате параметры вручную прописываю.
Кифирчик
Дата: 08.07.2009 10:59:21
мде....
изначально было так
            '    addr_name         = '''+edtAddrName.Text+''' , ' +
            '    addr_short_name   = '''+edtAddrShortName.Text+''' , ' +
            '    addr_email        = '''+edtAddrEMail.Text+'''      , ' +
и работало... потом полей стало много, и некоторые умудрялись вставлять кавычки всякую другую дребедень вызывающую ошибки, да и как известно все нормальные пацаны юзают параметрические запросы )

по предложеным вариантам:
        cmd.ParamCheck := false;
        cmd.CommandText
          :=' UPDATE addr_book SET      ' +
            '    addr_name         = ?, ' +
            '    addr_short_name   = ?, ' +
            '    addr_email        = ?, ' +
            '    addr_tel          = ?, ' +
           ...
            ' WHERE 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.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     =  :addr_id ';
        cmd.Parameters.Refresh;
        cmd.Parameters.ParamByName('addr_name'      ).Value := edtAddrName.Text       ;
        cmd.Parameters.ParamByName('addr_short_name').Value := edtAddrShortName.Text  ;
        cmd.Parameters.ParamByName('addr_email'     ).Value := edtAddrEMail.Text      ;
        cmd.Parameters.ParamByName('addr_tel'       ).Value := edtAddrTel.Text        ;
        ...
        cmd.Parameters.ParamByName('addr_id'        ).Value := addr_id                ;
        ///
        cmd.Parameters.ParamByName('addr_name'      ).Direction := pdInput;
        cmd.Parameters.ParamByName('addr_short_name').Direction := pdInput;
        cmd.Parameters.ParamByName('addr_email'     ).Direction := pdInput;
        cmd.Parameters.ParamByName('addr_tel'       ).Direction := pdInput;
        ...
        cmd.Parameters.ParamByName('addr_id'        ).Direction := pdInput;


        cmd.Parameters.ParamByName('addr_name'      ).DataType := ftString;
        cmd.Parameters.ParamByName('addr_short_name').DataType := ftString;
        cmd.Parameters.ParamByName('addr_email'     ).DataType := ftString;
        cmd.Parameters.ParamByName('addr_tel'       ).DataType := ftString;
        ...
        cmd.Parameters.ParamByName('addr_id'        ).DataType := ftInteger;
в строке
cmd.Parameters.ParamByName('addr_name' ).Value := edtAddrName.Text ;
вылетает, выдаёт ошибку, что не знает таких параметров (
полтергейст однако
Petro123
Дата: 08.07.2009 11:07:39
Кифирчик,
тебе не тяжело будет проверить твой запрос на этом:
    ADOQuery1 := TADOQuery.Create(nil);
    ADOQuery1.Connection := FADOConn;
    ADOQuery1.SQL.Add(sSQL);
    ADOQuery1.Prepared;
    ADOQuery1.Parameters.ParamByName('AAAAAAAAAAA').Value := 111111111;
    ADOQuery1.Open;
Кифирчик
Дата: 08.07.2009 11:18:15
Petro123,
код
      ADOQuery1 := TADOQuery.Create(nil);
      ADOQuery1.Connection := conn;
      ADOQuery1.SQL.Text :=
         'INSERT INTO addr_book '+
         '( addr_name ,addr_short_name,addr_email,addr_tel,addr_place,addr_www, '+
         '  addr_inn,addr_kpp,addr_bik,addr_ogrn,addr_okpo,                     '+
         '  addr_rs,addr_rs_bank,addr_ls,addr_ls_bank,addr_ks,addr_ks_bank,     '+
         '  addr_boss,addr_maker,addr_comment)                                  '+
         'VALUES                                                               '+
         '( :addr_name,:addr_short_name,:addr_email,:addr_tel,:addr_place,:addr_www, '+
         '  :addr_inn,:addr_kpp,:addr_bik,:addr_ogrn,:addr_okpo,                     '+
         '  :addr_rs,:addr_rs_bank,:addr_ls,:addr_ls_bank,:addr_ks,:addr_ks_bank,    '+
         '  :addr_boss,:addr_maker,:addr_comment)                                    ';
      ADOQuery1.Prepared;
      //ADOQuery1.Parameters.ParamByName('AAAAAAAAAAA').Value := 111111111;
      ADOQuery1.Parameters.ParamByName('addr_name'      ).Value := edtAddrName.Text       ;
      ADOQuery1.Parameters.ParamByName('addr_short_name').Value := edtAddrShortName.Text  ;
      ADOQuery1.Parameters.ParamByName('addr_email'     ).Value := edtAddrEMail.Text      ;
      ADOQuery1.Parameters.ParamByName('addr_tel'       ).Value := edtAddrTel.Text        ;
      ...

      ADOQuery1.Parameters.ParamByName('addr_name'      ).Direction := pdInput;
      ADOQuery1.Parameters.ParamByName('addr_short_name').Direction := pdInput;
      ADOQuery1.Parameters.ParamByName('addr_email'     ).Direction := pdInput;
      ADOQuery1.Parameters.ParamByName('addr_tel'       ).Direction := pdInput;
      ...


      ADOQuery1.Parameters.ParamByName('addr_name'      ).DataType := ftString;
      ADOQuery1.Parameters.ParamByName('addr_short_name').DataType := ftString;
      ADOQuery1.Parameters.ParamByName('addr_email'     ).DataType := ftString;
      ...

      ADOQuery1.Open;
на Open вылетает ошибка: "текущий проводник данных не поддерживает возврат нескольких наборовд данных в результате одной операции"
RENaissance
Дата: 08.07.2009 11:21:43

Кифирчик, строки с ParamByName().Direction и ParamByName().DataType выкинуть.

Posted via ActualForum NNTP Server 1.4