![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Передача Null через параметры [D7, MSSQL, Postgres]
Ega23 © (2008-06-17 12:30:00)Задача: есть 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
ANB (2008-06-18 10:14:00) [1]
> Да-да. И ездю исключительно на Бентли, и пью только Реми.
И работаю тока с ораклом :)
Ega23 (2008-06-17 16:12:00) [2]
> Я с подозрительными базами не экспериментирую.
Да-да. И ездю исключительно на Бентли, и пью только Реми.
Anatoly Podgoretsky (2008-06-17 16:09:00) [3]> Ega23 (17.06.2008 15:41:11) [11]
Я с подозрительными базами не экспериментирую.
Ega23 (2008-06-17 15:41:00) [4]
> Для АДО это делается более естественным способом
>
> .Parameters.ParamByName('BeginDate').Value := Null
Да, вот только DataType параметра должен быть отпределён. У MSSQL он автоматом считывается. А у Postgres - нет, пришлось ручками добавлять.
Anatoly Podgoretsky (2008-06-17 15:33:00) [5]Для АДО это делается более естественным способом
.Parameters.ParamByName('BeginDate').Value := Null
То есть прямым присвоением NULL вместо вызова какого то метода.
Насчет граблей в рантайм - ноль граблей, вот с BDE проблемы были, но не с АДО
Ega23 (2008-06-17 14:45:00) [6]Вообще все эти параметры штука хоть и удобная, но только до поры до времени.
При создании DataSet в ран-тайм я столько граблей в своё время с ними поимел...
Ega23 (2008-06-17 14:43:00) [7]>
> Вечно ты не то используешь :)
Игорь, я прекрасно знаю, что у 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.
Игорь Шевченко (2008-06-17 14:39:00) [8]
> Игорь, если ты мне покажешь этот метод у 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 (2008-06-17 14:33:00) [9]
> если значение NULL, то параметр.Clear
Игорь, если ты мне покажешь этот метод у TParameter - я себя за локоть укушу.
Игорь Шевченко (2008-06-17 14:21:00) [10]
> Поэтому если значение равно 'NULL' - параметр=null, иначе
> - параметр=StrToInt(значение)
если значение NULL, то параметр.Clear
Ega23 (2008-06-17 12:52:00) [11]Я не пользуюсь ADOTable, ADOQuery и ADOStoredProc. Признаться, я даже с закладки иконки эти убрал.
Ega23 (2008-06-17 12:44:00) [12]
> это сообщение признак того, что параметр остался нетипизированным.
> типы параметры получают при присвоении значения или при
> явном присвоении типа параметру
Гм. Действительно, так получилось, спасибо.
Но я ,вообще-то, считал, что при открытом коннекте это дело должно автоматом проставиться (как раз в случае MSSQL так и происходит).
Ну да ладно, это уже детали. Ещё раз спасибо!
Василий Жогарев (2008-06-17 12:41:00) [13]А если использовать допустим, не
TADOCommand, а просто таблицу. Ну например:
ADOTable1.Insert;
ADOTable1Field1.Value := 'fbvkj';
ADOTable1Field2.Value := 'sdvfds';
ADOTable1Field3.Clear;
ADOTable1.Post;
Поросенок Винни-Пух (2008-06-17 12:36:00) [14]это сообщение признак того, что параметр остался нетипизированным.
типы параметры получают при присвоении значения или при явном присвоении типа параметру