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

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

Проблема с добавлением записи в таблицу. Delphi 2009. [FB 2.1]


Дмитрий Белькевич ©   (2009-06-30 13:33:00) 

Таблица:


CREATE TABLE PROTOCOLS_OBJECTS (
   OBJECT_NAME  CHAR(100),
   OBJECT_UID   INTEGER NOT NULL,
   USER_UID     INTEGER,
   TREE_ID      INTEGER DEFAULT 0
);


Добавляю запись с помощью TIBQuery + TIBUpdateSQL.

Код:


IBQuery1.Active := True;
IBQuery1.Edit;
IBQuery1.FieldByName('OBJECT_NAME').AsString := 'test';
IBQuery1.FieldByName('OBJECT_UID').AsInteger := 10;
IBQuery1.Post;


Код апдейтера:


insert into PROTOCOLS_OBJECTS
 (OBJECT_NAME, OBJECT_UID, USER_UID, TREE_ID)
values
 (:OBJECT_NAME, :OBJECT_UID, :USER_UID, :TREE_ID)


IBX'ы показывают: "Unsupported feature".

Проблема проявляется в procedure TIBQuery.SetParams в строчке case Params[i].DataType of.

Один из параметров (OBJECT_NAME) имеет тип ftFixedWideChar, соответственно, не обрабатывается case'ом.

Вопросов, как обычно, два: кто виноват и что делать?

Еще некоторые уточнения. Под D7 всё работало. Добавлять в базу нужно именно связкой TIBQuery + TIBUpdateSQL. Если двугих вариантов не будет, буду переписывать TIBQuery. Надеюсь на свой глюк.


Anatoly Podgoretsky   (2009-07-02 12:11:00) [1]

> PEAKTOP  (02.07.2009 12:00:16)  [16]

Во, даже пародии нет.


PEAKTOP   (2009-07-02 12:05:00) [2]

> в котором юникод или какая другая кодировка определяется настройками

Не настройками, а указанием:
1) CHARACTER SET при создании базы
2) CHARACTER SET при создании домена (USER-DEFINED типа данных)
3) CHARACTER SET при создании столбца таблицы.

При создании столбца в таблице поиск для определения CHARACTER SET осущетвляется в обратном прядке.


PEAKTOP   (2009-07-02 12:00:00) [3]

> но точного аналога nvarchar там нет, только пародия.

NVARCHAR(N) у нас нет вообще. И даже пародии.

NCHAR(N) - не более, чем ссылка на CHAR(N) ( http://firebirdsql.su/doku.php?id=tipy_dannyx) для "любителей красивостей" DDL кода и портирования DDL из других серверов. Пришел из проекта Fyracle (Firebird с синтаксисом Oracle), когда-то еще давно, когда после слияния кода Firebird 1.0 и Yaffil в Firebird 1.5 были планы по объединению Firebird 2.0 и Fyracle в Vulcan (Firebird 3.0). Сейчас текущая версия Firebird 2.5 и этими планами и не пахнет. Будет Firebird 3.0, но без Fyracle.


Anatoly Podgoretsky   (2009-07-02 09:30:00) [4]

> Вариант  (02.07.2009 9:21:13)  [13]

Про Оракл - varchar2
Про ФБ - постоянная оговорка, "или что там аналогичное", но точного аналога nvarchar там нет, только пародия.


Anatoly Podgoretsky   (2009-07-02 09:27:00) [5]

> Павел Калугин  (02.07.2009 9:04:12)  [12]

Юникод/Не Юникод


Вариант   (2009-07-02 09:21:00) [6]


> Павел Калугин ©   (02.07.09 09:04) [12]

В MS SQL
varchar -это символьные данные (строка) переменной длины один байт на символ

nvarchar -  это символьные данные (строка) переменной длины в Юникоде

У IB,FB и Оракла  нет типа nvarchar, а только varchar, в котором юникод или какая другая кодировка определяется настройками (но это возможно ошибочное утверждение, ибо я  работал с этими СУБД нерегулярно и давно. Во всяком случае в LangRef по IB 6 в типах данных nvarchar нет).


Павел Калугин   (2009-07-02 09:04:00) [7]

> [9] Anatoly Podgoretsky ©   (30.06.09 16:06)
> Меняй на nvarchar

А можно попросить разъяснить для чайика, в чем отличие varchar  от nvarchar?


Anatoly Podgoretsky   (2009-07-01 09:53:00) [8]

> Дмитрий Белькевич  (30.06.2009 17:08:10)  [10]

Меняй на nvarchar или как оно там называется. Потому что, сейчас все равно ошибка, не должно быть ftWideString для этого типа. Похоже что они очень наплевательски отнеслись к портированию FB


Дмитрий Белькевич   (2009-06-30 17:08:00) [9]

Проблема действительно в типе поля - char, временно поменял на varchar - тип поля  стал ftWideString. Попробую тип поля в базе постоянно поменять.

Всем спасибо, особенная благодарность Подгорецкому.


Anatoly Podgoretsky   (2009-06-30 16:06:00) [10]

Видимо из-за Юникодовости Д2009 и обычной кривизне "Борланда" при работе с параметрами.
ftFixedWideChar - это зеркальный тип nchar или как оно там в FB 2.1 называется. Это криво преобразованое OBJECT_NAME  CHAR(100), кстати а почему char, а не varchar.
В Д7 у тебя было ftFixedChar
Если мое предположение верно, то бороться только так - ожидать выхода Д13+ или же изменить тип в базе, для начала на varchar, затем nvarchar или ее эквивалент. nvarchar должно помочь.


Дмитрий Белькевич   (2009-06-30 15:51:00) [11]

Хорошо. Но я UTF8 нигде не указывал. Сама база - win1251, как и поле OBJECT_NAME таблицы, как и чарсет соединения - win1251. Откуда такая кодировка может взяться?


Anatoly Podgoretsky   (2009-06-30 15:46:00) [12]

> PEAKTOP  (30.06.2009 15:28:06)  [6]

И что это является эквивалентом UTF8
Вообще у меня статья составила мрачное впечатление.


PEAKTOP   (2009-06-30 15:28:00) [13]

> FAQ посмотрел. Увы, UTF8 не причастна к проблеме...

То есть как ? А как же это ?

> Один из параметров (OBJECT_NAME) имеет тип ftFixedWideChar,
>  соответственно, не обрабатывается case'ом.


Дмитрий Белькевич   (2009-06-30 15:22:00) [14]

FAQ посмотрел. Увы, UTF8 не причастна к проблеме...


Дмитрий Белькевич   (2009-06-30 15:00:00) [15]

>та шо ви говорите ! а какой в таком случае по-вашему запрос из компонента TIBUpdateSQL будет "дергаться" Insert или Update ?

Посмотрел - апдейт дёргается. Странно, что в d7 работает. Поменяю на insert. Очень давно изначальный код писался - видно ошибся.

Базу создавал IBExpertom. Чарсет устанавливал win1251. Смотрю Registration Info. Написано - win1251.

FAQ посмотрю, спасибо.


PEAKTOP   (2009-06-30 14:48:00) [16]

> Вставляю. Изменение edit на insert ничего не меняет.

та шо ви говорите ! а какой в таком случае по-вашему запрос из компонента TIBUpdateSQL будет "дергаться" Insert или Update ?

-----------------------------------
По сути вопроса. Чарсет при создании базы данных какой ? часом не UTF8 ?
Бо шо-то мне этот ваш вопрос сильно напоминает последние два пункта из вот этого: http://ibase.ru/unicode_faq.html


Дмитрий Белькевич   (2009-06-30 14:07:00) [17]

>Ты все таки разберись - ты вставляешь запись или изменяешь ее?

Вставляю. Изменение edit на insert ничего не меняет.


Sergey13   (2009-06-30 13:42:00) [18]

> [0] Дмитрий Белькевич   (30.06.09 13:33)

Ты все таки разберись - ты вставляешь запись или изменяешь ее?


Наверх

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