Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2009.01.25;
Скачать: [xml.tar.bz2];

Вниз

Передача 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.48 MB
Время: 0.009 c
15-1227878192
Jeer
2008-11-28 16:16
2009.01.25
FoxBase


15-1227947603
Slider007
2008-11-29 11:33
2009.01.25
С днем рождения ! 29 ноября 2008 суббота


3-1213691445
Ega23
2008-06-17 12:30
2009.01.25
Передача Null через параметры


11-1196604968
Elec3C
2007-12-02 17:16
2009.01.25
Localizy


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





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский