-
Здравствуйте, коллеги! Подключаюсь к БД Oracle через ADO, используя компоненты ADOConnection и ADOQuery. Проблемный кусок кода:
sqlstr := 'INSERT INTO OBH_RZ_DAT '+
' (ID_FILE, ID_HOU, NM_KN) '+
' VALUES (:pr_file, :pr_id_hou, :pr_nm_kk)';
with DataModule2.ADOQuery1 do
begin
Close;
SQL.Clear;
SQL.Add(sqlstr);
Parameters[0].Value := p_id_file;
Parameters[1].Value := p_id_hou;
Parameters[2].Value := p_nm_kk;
ExecSQL;
Close;
end;
В данном случае я вставляю данные из Excel в Oracle. И если p_id_file, p_id_hou и p_nm_kk, взятые из файла Excel содержат данные, то все происходит нормально. Проблема наблюдается только, если в Excel какое-либо значение пустое. Delphi его видит как пустую строку, но Oracle при Insert естественно не видит там NULL. Вопрос: как в данном случае, именно через параметры корректно вставить в базу NULL?
-
if p_id_hou='' then Parameters[1].Value := Null;
-
-
> evvcom © (02.09.08 16:55) [2]
> или Parameters[1].Clear
Эт вряд ли (с)
-
> evvcom © (02.09.08 16:55) [2]
>
> или Parameters[1].Clear
>
Судя по тому, что
DataModule2.ADOQuery1
- это будет TParameter, а не TParam. А у TParameter нет метода Clear.
-
но Oracle при Insert естественно не видит там NULL.
так может там не пустая строка, а пробельчики?
-
а ну с ADO может и вряд ли. Я все же для Оракла пользую заточенные под него компоненты, а там это уже не "вряд ли" :-)
-
> evvcom © (02.09.08 17:10) [6]
"Вряд ли" относилось строго к теме.
А так - мало ли, кто что пользует. Я вот на метро езжу. И автобус пользую...:)
-
1. ну про "строго к теме" в [3] ничего нет
2. Clear бы в ADO параметрах не помешал бы. Почему-то во всех прочих это есть, а в адо нет!? Я предполагал, что есть.
3. Мало ни мало, а я вот на метро не езжу. Почти. А автобус, бывает... пользую. :)
-
> Clear бы в ADO параметрах не помешал бы.
Согласен. Но чего нет - того нет.
-
> Я вот на метро езжу. И автобус пользую...:)
незаслуженно обойдены вниманием трамваи.
> но Oracle при Insert естественно не видит там NULL
А типы полей в оракле какие ?
-
Игорь Шевченко
По крайней мере с Varchar2, если в Excel пустая строка, точно не работает.
-
Медвежонок Пятачок
Там пустая строка, с пробелами как раз-таки абсолютно нормально все должно пройти, по крайней мере для Varchar2.
-
Ega23if p_id_hou='' then Parameters[1].Value := Null;
Это не срабатывает. :( Попробовал, пишет неправлиьно задан Parameter. Несоответствие типов и т.п.
Как быть, кто знает? Delphi-шный nil также не срабатывает.
-
> незаслуженно обойдены вниманием трамваи.
Заслуженно, не сомневайся.
-
> Попробовал, пишет неправлиьно задан Parameter.
1. Какой DataType параметра?
2. Какие атрибуты у параметра?
-
> пишет неправлиьно задан Parameter. Несоответствие типов
> и т.п.
Прям вот так вот и пишет?
-
Johnmen
Сообщение об ошибке такое: "Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения". Именно так, один в один.
-
Ega23
А каким образом тип TDataType привести к строковому, чтобы посмотреть на выходе DataType? И еще - что такое атрибуты параметра?
-
> Razrab7 © (03.09.08 13:14) [17]
Как выглядит код? И на какой строке ошибка?
-
Johnmen
Код я привел в самом первом сообщении. Ошибка выскакивает на строке с ExecSQL.
-
> Razrab7 © (03.09.08 12:10) [13]
Unassigned попробуй
-
> Razrab7 © (03.09.08 15:19) [20]
> Код я привел в самом первом сообщении. Ошибка выскакивает
> на строке с ExecSQL.
В первом сообщении по поводу кода написано, что он работает.
Приводи реальный текущий код...
-
Johnmen
Да это реальный код. Я же написал, что ошибка возникает, если любое поле в Excel пустое, например p_nm_kk=''.
-
> Razrab7 © (03.09.08 15:59) [23]
Блин... Ты можешь связно излагать?
Какой нахрен Excel? Какое нахрен поле в Excel?
Какое вообще отношение код [0] имеет к эксел, кроме твоего воображения?
Короче.
Есть реальные код с ошибкой (указанной выше) и значения переменных - есть попытка помочь.
Нету - нет.
-
PalladinUnassigned не сработало. Та же вышеуказанная ошибка.
Решил проблему по-другому в Insert поставил to_char(:pr_nm_kk).
А в проверке написал следующее:
if p_nm_kk = '' then
Parameters[2].Value := ''
else
Parameters[2].Value := p_nm_kk;
В итоге все нормально, в оракловую базу вставляется именно NULL. Может быть у кого есть еще какие-то варианты? Уже просто интересно становится. Казалось бы простая вещь и столько проковырялся.
-
JohnmenА ты самое первое мое сообщение внимательно читай, там все описано.
Что там может быть неясного???!!! p_id_file, p_id_hou, p_nm_kk - это переменные, которые получены из полей Excel-файла.
Например вот:
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Application.EnableEvents := false;
Workbook := ExcelApp.WorkBooks.Add('file.xls');
p_id_file := WorkBook.WorkSheets[1].Range['A5'].Value;
p_id_hou := WorkBook.WorkSheets[1].Range['B5'].Value;
p_nm_kk := WorkBook.WorkSheets[1].Range['C5'].Value;
Если тебе это конечно поможет ...
-
> Razrab7 © (03.09.08 16:17) [25]
а, это в плане того что если пустая строка тебе пустая в базе и нужна? насколько я помню (когда то давно по моему Игорь говорил), что в оракле нет понятия пустой строки, пустая строка и Null отождествленны, потому Null и заносится
-
Palladin
Все верно, в Oracle нет пустой строки, а есть только NULL. Ну мне и в базе нужно тоже NULL получить, если в Excel строка пустая.
-
присвой параметру trim(vartostr()) и улетит нулл если в ячейке пусто
-
кстати, что там реально вставляется, если ячейка пуста и оракл не чувствует после вставки нула?
-
> Может быть у кого есть еще какие-то варианты?
есть. не присваивать параметрам значения типа Variant, а делать явное преобразование (AsString, AsInteger, ...). Для строковых делать VarToStr
-
Я так понимаю, что все значения получаемые из Excel файла (WorkBook.WorkSheets[1].Range['A5'].Value и т.п.) - типа Variant?
И именно здесь и происходит засада?
-
что реально попадает на сервер? можешь сказать?
-
> Я так понимаю, что все значения получаемые из Excel файла
> (WorkBook.WorkSheets[1].Range['A5'].Value и т.п.) - типа
> Variant?
> И именно здесь и происходит засада?
Правильно понимаешь
-
> что все значения получаемые из Excel файла (WorkBook.WorkSheets[1].
> Range['A5'].Value и т.п.) - типа Variant?
А при работе с COM, OLE и т.п. все типы Variant и оракл совсем не причем. Засада в твоем коде и твоем непонимании типа Variant
-
Спасибо всем, коллеги! Разъяснили проблему.