Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Передача 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]

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо