Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2009.01.25;
Скачать: CL | DM;

Вниз

Передача Null через параметры   Найти похожие ветки 

 
Ega23 ©   (2008-06-17 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


 
Поросенок Винни-Пух ©   (2008-06-17 12:36) [1]

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


 
Василий Жогарев ©   (2008-06-17 12:41) [2]

А если использовать допустим, не TADOCommand, а просто таблицу. Ну например:

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


 
Ega23 ©   (2008-06-17 12:44) [3]


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


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

Ну да ладно, это уже детали. Ещё раз спасибо!


 
Ega23 ©   (2008-06-17 12:52) [4]

Я не пользуюсь ADOTable, ADOQuery и ADOStoredProc. Признаться, я даже с закладки иконки эти убрал.


 
Игорь Шевченко ©   (2008-06-17 14:21) [5]


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


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


 
Ega23 ©   (2008-06-17 14:33) [6]


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


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


 
Игорь Шевченко ©   (2008-06-17 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 ©   (2008-06-17 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 ©   (2008-06-17 14:45) [9]

Вообще все эти параметры штука хоть и удобная, но только до поры до времени.
При создании DataSet в ран-тайм я столько граблей в своё время с ними поимел...


 
Anatoly Podgoretsky ©   (2008-06-17 15:33) [10]

Для АДО это делается более естественным способом

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

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

Насчет граблей в рантайм - ноль граблей, вот с BDE проблемы были, но не с АДО


 
Ega23 ©   (2008-06-17 15:41) [11]


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


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


 
Anatoly Podgoretsky ©   (2008-06-17 16:09) [12]

> Ega23  (17.06.2008 15:41:11)  [11]

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


 
Ega23 ©   (2008-06-17 16:12) [13]


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


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


 
ANB   (2008-06-18 10:14) [14]


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

И работаю тока с ораклом :)



Страницы: 1 вся ветка

Текущий архив: 2009.01.25;
Скачать: CL | DM;

Наверх




Память: 0.5 MB
Время: 0.02 c
3-1213780942
stas
2008-06-18 13:22
2009.01.25
Закачать большой файл в Blob


2-1229273738
Morpheus
2008-12-14 19:55
2009.01.25
простой вопрос по RTTI


3-1213161383
Инна
2008-06-11 09:16
2009.01.25
Как у компонента ADOConnect прописать путь до базы данных Access


2-1228910713
rhammer
2008-12-10 15:05
2009.01.25
OnKeyDown при динамическом TPageControl


3-1212590501
Varlon
2008-06-04 18:41
2009.01.25
dbgrid заполняется из sql запроса. Надо добавить колонку.