Конференция "Базы" » NULL в Oracle и пустая строка в Delphi
 
  • Razrab7 © (02.09.08 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 © (02.09.08 15:46) [1]
    if p_id_hou='' then Parameters[1].Value := Null;

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

  • Johnmen © (02.09.08 17:02) [3]

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

    Эт вряд ли (с)
  • Ega23 © (02.09.08 17:04) [4]

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


    Судя по тому, что
    DataModule2.ADOQuery1

    - это будет TParameter, а не TParam. А у TParameter нет метода Clear.
  • Медвежонок Пятачок © (02.09.08 17:07) [5]
    но Oracle при Insert естественно не видит там NULL.

    так может там не пустая строка, а пробельчики?
  • evvcom © (02.09.08 17:10) [6]
    а ну с ADO может и вряд ли. Я все же для Оракла пользую заточенные под него компоненты, а там это уже не "вряд ли" :-)
  • Johnmen © (02.09.08 17:20) [7]

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

    "Вряд ли" относилось строго к теме.
    А так - мало ли, кто что пользует. Я вот на метро езжу. И автобус пользую...:)
  • evvcom © (02.09.08 17:37) [8]
    1. ну про "строго к теме" в [3] ничего нет
    2. Clear бы в ADO параметрах не помешал бы. Почему-то во всех прочих это есть, а в адо нет!? Я предполагал, что есть.
    3. Мало ни мало, а я вот на метро не езжу. Почти. А автобус, бывает... пользую. :)
  • Ega23 © (02.09.08 20:04) [9]

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


    Согласен. Но чего нет - того нет.
  • Игорь Шевченко © (03.09.08 09:58) [10]

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


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


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


    А типы полей в оракле какие ?
  • Razrab7 © (03.09.08 11:44) [11]
    Игорь Шевченко

    По крайней мере с Varchar2, если в Excel пустая строка, точно не работает.
  • Razrab7 © (03.09.08 11:46) [12]
    Медвежонок Пятачок

    Там пустая строка, с пробелами как раз-таки абсолютно нормально все должно пройти, по крайней мере для Varchar2.
  • Razrab7 © (03.09.08 12:10) [13]
    Ega23

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



    Это не срабатывает. :( Попробовал, пишет неправлиьно задан Parameter. Несоответствие типов и т.п.
    Как быть, кто знает? Delphi-шный nil также не срабатывает.
  • Johnmen © (03.09.08 12:54) [14]

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

    Заслуженно, не сомневайся.
  • Ega23 © (03.09.08 13:06) [15]

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


    1. Какой DataType параметра?
    2. Какие атрибуты у параметра?
  • Johnmen © (03.09.08 13:08) [16]

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

    Прям вот так вот и пишет?
  • Razrab7 © (03.09.08 13:14) [17]
    Johnmen

    Сообщение об ошибке такое: "Неправильно определен объект Parameter. Предоставлены несовместимые или неполные сведения". Именно так, один в один.
  • Razrab7 © (03.09.08 13:30) [18]
    Ega23

    А каким образом тип TDataType привести к строковому, чтобы посмотреть на выходе DataType? И еще - что такое атрибуты параметра?
  • Johnmen © (03.09.08 14:17) [19]

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

    Как выглядит код? И на какой строке ошибка?
  • Razrab7 © (03.09.08 15:19) [20]
    Johnmen

    Код я привел в самом первом сообщении. Ошибка выскакивает на строке с ExecSQL.
  • Palladin © (03.09.08 15:26) [21]

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

    Unassigned попробуй
  • Johnmen © (03.09.08 15:38) [22]

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

    В первом сообщении по поводу кода написано, что он работает.
    Приводи реальный текущий код...
  • Razrab7 © (03.09.08 15:59) [23]
    Johnmen

    Да это реальный код. Я же написал, что ошибка возникает, если любое поле в Excel пустое, например p_nm_kk=''.
  • Johnmen © (03.09.08 16:17) [24]

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

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

    Короче.
    Есть реальные код с ошибкой (указанной выше) и значения переменных - есть попытка помочь.
    Нету - нет.
  • Razrab7 © (03.09.08 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 © (03.09.08 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 © (03.09.08 16:40) [27]

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

    а, это в плане того что если пустая строка тебе пустая в базе и нужна? насколько я помню (когда то давно по моему Игорь говорил), что в оракле нет понятия пустой строки, пустая строка и Null отождествленны, потому Null и заносится
  • Razrab7 © (03.09.08 17:31) [28]
    Palladin

    Все верно, в Oracle нет пустой строки, а есть только NULL. Ну мне и в базе нужно тоже NULL получить, если в Excel строка пустая.
  • Медвежонок Пятачок © (03.09.08 17:52) [29]
    присвой параметру trim(vartostr()) и улетит нулл если в ячейке пусто
  • Медвежонок Пятачок © (03.09.08 18:40) [30]
    кстати, что там реально вставляется, если ячейка пуста и оракл не чувствует после вставки нула?
  • Игорь Шевченко © (04.09.08 09:46) [31]

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


    есть. не присваивать параметрам значения типа Variant, а делать явное преобразование (AsString, AsInteger, ...). Для строковых делать VarToStr
  • Razrab7 © (05.09.08 11:34) [32]
    Я так понимаю, что все значения получаемые из Excel файла (WorkBook.WorkSheets[1].Range['A5'].Value и т.п.) - типа Variant?
    И именно здесь и происходит засада?
  • Медвежонок Пятачок © (05.09.08 11:39) [33]
    что реально попадает на сервер? можешь сказать?
  • Игорь Шевченко © (05.09.08 12:01) [34]

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


    Правильно понимаешь
  • evvcom © (05.09.08 12:31) [35]

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

    А при работе с COM, OLE и т.п. все типы Variant и оракл совсем не причем. Засада в твоем коде и твоем непонимании типа Variant
  • Razrab7 © (05.09.08 15:20) [36]
    Спасибо всем, коллеги! Разъяснили проблему.
 
Конференция "Базы" » NULL в Oracle и пустая строка в Delphi
Есть новые Нет новых   [134435   +34][b:0.001][p:0.002]