-
Задача: есть 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
-
это сообщение признак того, что параметр остался нетипизированным. типы параметры получают при присвоении значения или при явном присвоении типа параметру
-
А если использовать допустим, не TADOCommand , а просто таблицу. Ну например: ADOTable1.Insert;
ADOTable1Field1.Value := 'fbvkj';
ADOTable1Field2.Value := 'sdvfds';
ADOTable1Field3.Clear;
ADOTable1.Post;
-
> это сообщение признак того, что параметр остался нетипизированным. > типы параметры получают при присвоении значения или при > явном присвоении типа параметру
Гм. Действительно, так получилось, спасибо. Но я ,вообще-то, считал, что при открытом коннекте это дело должно автоматом проставиться (как раз в случае MSSQL так и происходит).
Ну да ладно, это уже детали. Ещё раз спасибо!
-
Я не пользуюсь ADOTable, ADOQuery и ADOStoredProc. Признаться, я даже с закладки иконки эти убрал.
-
> Поэтому если значение равно 'NULL' - параметр=null, иначе > - параметр=StrToInt(значение)
если значение NULL, то параметр.Clear
-
> если значение NULL, то параметр.Clear
Игорь, если ты мне покажешь этот метод у TParameter - я себя за локоть укушу.
-
> Игорь, если ты мне покажешь этот метод у 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-ы
-
> > Вечно ты не то используешь :) Игорь, я прекрасно знаю, что у 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.
-
Вообще все эти параметры штука хоть и удобная, но только до поры до времени. При создании DataSet в ран-тайм я столько граблей в своё время с ними поимел...
-
Для АДО это делается более естественным способом .Parameters.ParamByName('BeginDate').Value := Null То есть прямым присвоением NULL вместо вызова какого то метода. Насчет граблей в рантайм - ноль граблей, вот с BDE проблемы были, но не с АДО
-
> Для АДО это делается более естественным способом > > .Parameters.ParamByName('BeginDate').Value := Null
Да, вот только DataType параметра должен быть отпределён. У MSSQL он автоматом считывается. А у Postgres - нет, пришлось ручками добавлять.
-
> Ega23 (17.06.2008 15:41:11) [11]
Я с подозрительными базами не экспериментирую.
-
> Я с подозрительными базами не экспериментирую.
Да-да. И ездю исключительно на Бентли, и пью только Реми.
-
> Да-да. И ездю исключительно на Бентли, и пью только Реми.
И работаю тока с ораклом :)
|