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

Вниз

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

Наверх





Память: 0.53 MB
Время: 0.005 c
2-1238425047
yammi
2009-03-30 18:57
2009.05.10
Помогите с синтаксисом, как код Builder в дельфи записать?


2-1238085741
bmw09121985
2009-03-26 19:42
2009.05.10
Функции, используемые диалоговыми окнами


15-1236460043
Kostafey
2009-03-08 00:07
2009.05.10
8 Марта


15-1236238528
ford
2009-03-05 10:35
2009.05.10
модераторам ветки


15-1236203903
Германн
2009-03-05 00:58
2009.05.10
Welcom Page





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский