Форум: "Базы";
Текущий архив: 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.006 c