Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

NULL в Oracle и пустая строка в Delphi


Страницы:   1 2

Razrab7 ©   (2008-09-02 15:44:00) 

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


Razrab7   (2008-09-05 15:20:00) [1]

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


evvcom   (2008-09-05 12:31:00) [2]


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

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


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


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


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


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

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


Razrab7   (2008-09-05 11:34:00) [5]

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


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


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


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


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

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


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

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


Razrab7   (2008-09-03 17:31:00) [9]

Palladin

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


Palladin   (2008-09-03 16:40:00) [10]


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

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


Razrab7   (2008-09-03 16:27:00) [11]

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   (2008-09-03 16:17:00) [12]

Palladin

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

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


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


Johnmen   (2008-09-03 16:17:00) [13]


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

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

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


Razrab7   (2008-09-03 15:59:00) [14]

Johnmen

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


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


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

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


Palladin   (2008-09-03 15:26:00) [16]


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

Unassigned попробуй


Razrab7   (2008-09-03 15:19:00) [17]

Johnmen

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


Johnmen   (2008-09-03 14:17:00) [18]


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

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


Razrab7   (2008-09-03 13:30:00) [19]

Ega23

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


Razrab7   (2008-09-03 13:14:00) [20]

Johnmen

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо