Конференция "Базы" » Передача Null через параметры [D7, MSSQL, Postgres]
 
  • Ega23 © (17.06.08 12:30) [0]
    Задача: есть CommandText : 'insert into table (col1, col2) values (:val1, :val2)'
    Есть список значений, типа (1, null), (2, 1), (3,1) ....
    Есть TADOCommand. С ним в ран-тайм делаю следующее:
    1. Задаю Connection (Connected=True)
    2. ParamCheck := True;
    3. Назначаю CommandText
    4. Prepared := True;
    5. Иду в цикле, назначаю параметры, выполняю.

    Список значений в виде строк. Поэтому если значение равно 'NULL' - параметр=null, иначе - параметр=StrToInt(значение)

    Собственно, происходит следующее: в случае MSSQL всё проходит на ура. В случае Postgres на первом же Null-значении параметра получаю "Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения"

    Попробовал сделать в DesignTime, выставил все параметры, для нужного задал paNullable. Результат тот же.

    Использую ADO, для связи с MSSQL - MSSQL OLEDB Provider, для связи с Postgres - ODBC Provider
  • Поросенок Винни-Пух © (17.06.08 12:36) [1]
    это сообщение признак того, что параметр остался нетипизированным.
    типы параметры получают при присвоении значения или при явном присвоении типа параметру
  • Василий Жогарев © (17.06.08 12:41) [2]
    А если использовать допустим, не
    TADOCommand

    , а просто таблицу. Ну например:

    ADOTable1.Insert;
    ADOTable1Field1.Value := 'fbvkj';
    ADOTable1Field2.Value := 'sdvfds';
    ADOTable1Field3.Clear;
    ADOTable1.Post;

  • Ega23 © (17.06.08 12:44) [3]

    > это сообщение признак того, что параметр остался нетипизированным.
    > типы параметры получают при присвоении значения или при
    > явном присвоении типа параметру


    Гм. Действительно, так получилось, спасибо.
    Но я ,вообще-то, считал, что при открытом коннекте это дело должно автоматом проставиться (как раз в случае MSSQL так и происходит).

    Ну да ладно, это уже детали. Ещё раз спасибо!
  • Ega23 © (17.06.08 12:52) [4]
    Я не пользуюсь ADOTable, ADOQuery и ADOStoredProc. Признаться, я даже с закладки иконки эти убрал.
  • Игорь Шевченко © (17.06.08 14:21) [5]

    > Поэтому если значение равно 'NULL' - параметр=null, иначе
    > - параметр=StrToInt(значение)


    если значение NULL, то параметр.Clear
  • Ega23 © (17.06.08 14:33) [6]

    > если значение NULL, то параметр.Clear


    Игорь, если ты мне покажешь этот метод у TParameter - я себя за локоть укушу.
  • Игорь Шевченко © (17.06.08 14:39) [7]

    > Игорь, если ты мне покажешь этот метод у TParameter - я
    > себя за локоть укушу.


    Вечно ты не то используешь :)

    У Tparam (у которого есть этот метод) в его реализации стоит
    FNull := true;
    FData := Unassigned

    а в процедуре
    procedure TParameter.SetValue(const Value: Variant);

    получается, что все равно:

    begin
     if VarIsClear(Value) or VarIsNull(Value) then
       NewValue := Null

    впрочем, надо узнать, поддерживает ли PostGres ODBC NULL-ы
  • Ega23 © (17.06.08 14:43) [8]
    >
    > Вечно ты не то используешь :)


    Игорь, я прекрасно знаю, что у TParam есть Clear. Вот только в первом посте четко было сказано про ADO.


    TParam represents a field parameter for a query or stored procedure.

    Unit

    DB

    Description

    Use the properties of a TParam to set the value of a parameter that represents the value of a field. Datasets that represent queries and stored procedures create TParam objects to represent the parameters of their query or stored procedures. Client datasets use TParam objects to pass parameter values to a source dataset.

    Note: ADO-based datasets do not use TParam objects to represent parameter values. They use the TParameter class instead.

    TParam shares many properties with TField, as both describe the value of a field in a dataset. However, a TField object has several properties to describe the field binding, and how the field is displayed, edited, or calculated that are not needed in a TParam object. Conversely, TParam includes properties that indicate how the field value is passed as a parameter.

  • Ega23 © (17.06.08 14:45) [9]
    Вообще все эти параметры штука хоть и удобная, но только до поры до времени.
    При создании DataSet в ран-тайм я столько граблей в своё время с ними поимел...
  • Anatoly Podgoretsky © (17.06.08 15:33) [10]
    Для АДО это делается более естественным способом

    .Parameters.ParamByName('BeginDate').Value := Null



    То есть прямым присвоением NULL вместо вызова какого то метода.

    Насчет граблей в рантайм - ноль граблей, вот с BDE проблемы были, но не с АДО
  • Ega23 © (17.06.08 15:41) [11]

    > Для АДО это делается более естественным способом
    >
    > .Parameters.ParamByName('BeginDate').Value := Null


    Да, вот только DataType параметра должен быть отпределён. У MSSQL он автоматом считывается. А у Postgres - нет, пришлось ручками добавлять.
  • Anatoly Podgoretsky © (17.06.08 16:09) [12]
    > Ega23  (17.06.2008 15:41:11)  [11]

    Я с подозрительными базами не экспериментирую.
  • Ega23 © (17.06.08 16:12) [13]

    > Я с подозрительными базами не экспериментирую.


    Да-да. И ездю исключительно на Бентли, и пью только Реми.
  • ANB (18.06.08 10:14) [14]

    > Да-да. И ездю исключительно на Бентли, и пью только Реми.

    И работаю тока с ораклом :)
 
Конференция "Базы" » Передача Null через параметры [D7, MSSQL, Postgres]
Есть новые Нет новых   [134434   +27][b:0][p:0.001]