Проблемы с написанием запроса INSERT в IBQuery

IBX, FIBPlus, UIB, ADO, .Net и прочее-прочее-прочее, в общем все, что относится к созданию приложений, работающих с InterBase, Firebird и Yaffil - клиент-серверных, трехзвенных, консольных и т.п.

Модератор: kdv

Ответить
Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Проблемы с написанием запроса INSERT в IBQuery

Сообщение Pavel_ch » 09 мар 2006, 15:34

В D7 пишу клиентское приложение. Сервер IB7.0.1
Возникла проблема с динамическим получением текста запроса на добавление записи.
Проблема вот в чём.
Если общий вид запроса

Код: Выделить всё

INSERT INTO Money (Field1,Field2,Field3) VALUES(Val1,Val2,Val3)
то как быть, если, к примеру val1=1234,45 val2=2345,56 и val3= 1111,11? Ведь запятую IB понимает как разделитель значенй, а не как разделитель целой и дробной части.
Соответственно при попытке запустить такой запрос вылетает исключение с сообщением, что кол-во значений не соответствует кол-ву полей.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 мар 2006, 16:01

нет никакой проблемы. для sql формат дат и чисел, передаваемых как строка, то есть в ТЕКСТЕ sql-запроса, определен жестко. И разделителем дробной части является точка.
Альтернативно, вместо написания на клиенте
FloatToStr(Val1)+', '+FloatToStr(Val2)...
можно использовать параметры. Там разделителей "нет", т.к. данные передаются в двоичном виде, как есть.
insert into x (field1) values (:param1)

Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Сообщение Pavel_ch » 09 мар 2006, 16:55

Вот метаданные таблицы в которую добавляются записи

Код: Выделить всё

CREATE TABLE "MONEY" 
(
  "ID"	INTEGER NOT NULL,
  "MONDATE"	DATE,
  "MONBEG"	NUMERIC(2, 2),
  "MONEND"	NUMERIC(2, 2),
  "MONRES"	NUMERIC(2, 2),
  "DAYOFWEEK"	CHAR(2) CHARACTER SET WIN1251,
 PRIMARY KEY ("ID")
);
В Delphi пишу запрос на добавление записи (этот текст генерится программой, в итоге в запрос попадает следующее)

Код: Выделить всё

INSERT INTO MONEY(ID,MONDATE,MONBEG,MONEND,MONRES,DAYOFWEEK) 
VALUES(23,'08.03.2006',:BegSum,:EndSum,:Result,'Ср')
При попытке выполнить вылетает исключение:
arithmetic exception, numeric overflow or string truncation
Тоже самое говорит IBConsole при попытке выполнить запрос в Interactive SQL.
Суть задачи в том, что мне нужно хранить в полях MONBEG, MONEND и MONRES денежные суммы (рубли,копейки) и после запятой мне нужно только два знака. Думаю что конфликт возникает где-то в пределах между Float и Numeric. Но что к чему не разбирусь никак...

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 мар 2006, 17:42

1. двойные кавычки у имени таблицы и столбцов зачем???
2. ошибка скорее всего из-за нечтения www.ibase.ru/devinfo/ibrusfaq.htm
чарсет надо указывать в свойствах IBDatabase, в параметрах коннекта IBConsole, IBExpert и т.п..

Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Сообщение Pavel_ch » 09 мар 2006, 18:17

двойные кавычки у имени таблицы и столбцов зачем???
Естественно, я так не делал когда таблицу создавал. Я ж написал, что это метаданные. Взял их из IBConsole

Я докопался до истины, у меня описание полей типа NUMERIC неверное было. Сделал NUMERIC(10,2) и всё заработало. У меня ж там рублей на десятки тысяч счёт идёт в одну запись, вот и не влезали они в мой тип данных.

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 09 мар 2006, 18:29

Взял их из IBConsole
поставь IBExpert, IBConsole выкинь.
вот и не влезали они в мой тип данных
дык. :) мог бы не экономить, и написать 15,2 или 18,2 - все равно начиная с 9,2 для numeric "внизу" используется один тип данных - int64 (в 3-ем диалекте).

Pavel_ch
Сообщения: 24
Зарегистрирован: 09 мар 2006, 15:21

Сообщение Pavel_ch » 09 мар 2006, 19:14

поставь IBExpert, IBConsole выкинь.
Тока сегодня поставил. Вещь!
дык. :) мог бы не экономить, и написать 15,2 или 18,2 - все равно начиная с 9,2 для numeric "внизу" используется один тип данных - int64 (в 3-ем диалекте).
:D Ну да, перебрал с легонца, там чисел таких и не будет, кажется.

Ответить