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

Вниз

NULL в Oracle и пустая строка в Delphi   Найти похожие ветки 

 
Razrab7 ©   (2008-09-02 15:44) [0]

Здравствуйте, коллеги! Подключаюсь к БД 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?


 
Ega23 ©   (2008-09-02 15:46) [1]

if p_id_hou="" then Parameters[1].Value := Null;


 
evvcom ©   (2008-09-02 16:55) [2]

или Parameters[1].Clear


 
Johnmen ©   (2008-09-02 17:02) [3]


> evvcom ©   (02.09.08 16:55) [2]
> или Parameters[1].Clear

Эт вряд ли (с)


 
Ega23 ©   (2008-09-02 17:04) [4]


> evvcom ©   (02.09.08 16:55) [2]
>
> или Parameters[1].Clear
>


Судя по тому, что DataModule2.ADOQuery1 - это будет TParameter, а не TParam. А у TParameter нет метода Clear.


 
Медвежонок Пятачок ©   (2008-09-02 17:07) [5]

но Oracle при Insert естественно не видит там NULL.

так может там не пустая строка, а пробельчики?


 
evvcom ©   (2008-09-02 17:10) [6]

а ну с ADO может и вряд ли. Я все же для Оракла пользую заточенные под него компоненты, а там это уже не "вряд ли" :-)


 
Johnmen ©   (2008-09-02 17:20) [7]


> evvcom ©   (02.09.08 17:10) [6]

"Вряд ли" относилось строго к теме.
А так - мало ли, кто что пользует. Я вот на метро езжу. И автобус пользую...:)


 
evvcom ©   (2008-09-02 17:37) [8]

1. ну про "строго к теме" в [3] ничего нет
2. Clear бы в ADO параметрах не помешал бы. Почему-то во всех прочих это есть, а в адо нет!? Я предполагал, что есть.
3. Мало ни мало, а я вот на метро не езжу. Почти. А автобус, бывает... пользую. :)


 
Ega23 ©   (2008-09-02 20:04) [9]


> Clear бы в ADO параметрах не помешал бы.


Согласен. Но чего нет - того нет.


 
Игорь Шевченко ©   (2008-09-03 09:58) [10]


> Я вот на метро езжу. И автобус пользую...:)


незаслуженно обойдены вниманием трамваи.


> но Oracle при Insert естественно не видит там NULL


А типы полей в оракле какие ?


 
Razrab7 ©   (2008-09-03 11:44) [11]

Игорь Шевченко

По крайней мере с Varchar2, если в Excel пустая строка, точно не работает.


 
Razrab7 ©   (2008-09-03 11:46) [12]

Медвежонок Пятачок

Там пустая строка, с пробелами как раз-таки абсолютно нормально все должно пройти, по крайней мере для Varchar2.


 
Razrab7 ©   (2008-09-03 12:10) [13]

Ega23

if p_id_hou="" then Parameters[1].Value := Null;

Это не срабатывает. :( Попробовал, пишет неправлиьно задан Parameter. Несоответствие типов и т.п.
Как быть, кто знает? Delphi-шный nil также не срабатывает.


 
Johnmen ©   (2008-09-03 12:54) [14]


> незаслуженно обойдены вниманием трамваи.

Заслуженно, не сомневайся.


 
Ega23 ©   (2008-09-03 13:06) [15]


> Попробовал, пишет неправлиьно задан Parameter.


1. Какой DataType параметра?
2. Какие атрибуты у параметра?


 
Johnmen ©   (2008-09-03 13:08) [16]


> пишет неправлиьно задан Parameter. Несоответствие типов
> и т.п.

Прям вот так вот и пишет?


 
Razrab7 ©   (2008-09-03 13:14) [17]

Johnmen

Сообщение об ошибке такое: "Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения". Именно так, один в один.


 
Razrab7 ©   (2008-09-03 13:30) [18]

Ega23

А каким образом тип TDataType привести к строковому, чтобы посмотреть на выходе DataType? И еще - что такое атрибуты параметра?


 
Johnmen ©   (2008-09-03 14:17) [19]


> Razrab7 ©   (03.09.08 13:14) [17]

Как выглядит код? И на какой строке ошибка?


 
Razrab7 ©   (2008-09-03 15:19) [20]

Johnmen

Код я привел в самом первом сообщении. Ошибка выскакивает на строке с ExecSQL.


 
Palladin ©   (2008-09-03 15:26) [21]


> Razrab7 ©   (03.09.08 12:10) [13]

Unassigned попробуй


 
Johnmen ©   (2008-09-03 15:38) [22]


> Razrab7 ©   (03.09.08 15:19) [20]
> Код я привел в самом первом сообщении. Ошибка выскакивает
> на строке с ExecSQL.

В первом сообщении по поводу кода написано, что он работает.
Приводи реальный текущий код...


 
Razrab7 ©   (2008-09-03 15:59) [23]

Johnmen

Да это реальный код. Я же написал, что ошибка возникает, если любое поле в Excel пустое, например p_nm_kk="".


 
Johnmen ©   (2008-09-03 16:17) [24]


> Razrab7 ©   (03.09.08 15:59) [23]

Блин... Ты можешь связно излагать?
Какой нахрен Excel? Какое нахрен поле в Excel?
Какое вообще отношение код [0] имеет к эксел, кроме твоего воображения?

Короче.
Есть реальные код с ошибкой (указанной выше) и значения переменных - есть попытка помочь.
Нету - нет.


 
Razrab7 ©   (2008-09-03 16:17) [25]

Palladin

Unassigned не сработало. Та же вышеуказанная ошибка.
Решил проблему по-другому в Insert поставил to_char(:pr_nm_kk).
А в проверке написал следующее:

     if p_nm_kk = "" then
           Parameters[2].Value := ""
     else
           Parameters[2].Value := p_nm_kk;


В итоге все нормально, в оракловую базу вставляется именно NULL. Может быть у кого есть еще какие-то варианты? Уже просто интересно становится. Казалось бы простая вещь и столько проковырялся.


 
Razrab7 ©   (2008-09-03 16:27) [26]

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;


Если тебе это конечно поможет ...


 
Palladin ©   (2008-09-03 16:40) [27]


> Razrab7 ©   (03.09.08 16:17) [25]

а, это в плане того что если пустая строка тебе пустая в базе и нужна? насколько я помню (когда то давно по моему Игорь говорил), что в оракле нет понятия пустой строки, пустая строка и Null отождествленны, потому Null и заносится


 
Razrab7 ©   (2008-09-03 17:31) [28]

Palladin

Все верно, в Oracle нет пустой строки, а есть только NULL. Ну мне и в базе нужно тоже NULL получить, если в Excel строка пустая.


 
Медвежонок Пятачок ©   (2008-09-03 17:52) [29]

присвой параметру trim(vartostr()) и улетит нулл если в ячейке пусто


 
Медвежонок Пятачок ©   (2008-09-03 18:40) [30]

кстати, что там реально вставляется, если ячейка пуста и оракл не чувствует после вставки нула?


 
Игорь Шевченко ©   (2008-09-04 09:46) [31]


> Может быть у кого есть еще какие-то варианты?


есть. не присваивать параметрам значения типа Variant, а делать явное преобразование (AsString, AsInteger, ...). Для строковых делать VarToStr


 
Razrab7 ©   (2008-09-05 11:34) [32]

Я так понимаю, что все значения получаемые из Excel файла (WorkBook.WorkSheets[1].Range["A5"].Value и т.п.) - типа Variant?
И именно здесь и происходит засада?


 
Медвежонок Пятачок ©   (2008-09-05 11:39) [33]

что реально попадает на сервер? можешь сказать?


 
Игорь Шевченко ©   (2008-09-05 12:01) [34]


> Я так понимаю, что все значения получаемые из Excel файла
> (WorkBook.WorkSheets[1].Range["A5"].Value и т.п.) - типа
> Variant?
> И именно здесь и происходит засада?


Правильно понимаешь


 
evvcom ©   (2008-09-05 12:31) [35]


> что все значения получаемые из Excel файла (WorkBook.WorkSheets[1].
> Range["A5"].Value и т.п.) - типа Variant?

А при работе с COM, OLE и т.п. все типы Variant и оракл совсем не причем. Засада в твоем коде и твоем непонимании типа Variant


 
Razrab7 ©   (2008-09-05 15:20) [36]

Спасибо всем, коллеги! Разъяснили проблему.



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

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

Наверх




Память: 0.55 MB
Время: 0.008 c
15-1236462207
Игорь Шевченко
2009-03-08 00:43
2009.05.10
Всех с 8-м марта и заработавшим сайтом :)


15-1236196225
Petr V. Abramov
2009-03-04 22:50
2009.05.10
анализатор вывода event 10053


2-1238068203
D@nger
2009-03-26 14:50
2009.05.10
Операционка ругается


2-1238143029
igorntk
2009-03-27 11:37
2009.05.10
Поиск в БД


2-1237987387
J.S.
2009-03-25 16:23
2009.05.10
принадлежит ли значение набору