I use firebird as my database and mybatis to manipulate the data, but when I run a query with a keyword whose length is greater than 5, then the following errors happen:
### Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
If it’s length is lesser than 6, it runs fine. I update mybatis and firebird to latest version, and the result is the same thing.
Detailed sql is as below:
select b.*, bt.type_no as "type.id" , bt.type_dsc "type.name",
bt.show "type.show", bt.del "type.del"
from
book b,book_type bt
where
b.type_no=bt.type_no and bt.del=0
and b.del=0 and b.type_no in (74)
and (( lower(title) like '%aaaaaaaaa%' ) or ( lower(content) like '%aaaaaaaaa%' ))
order by bt.show desc,b.type_no,b.id
Followed by the error log:
2012-07-03 23:20:14 [DEBUG](org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:42) ooo Using Connection [org.firebirdsql.jdbc.FBConnection@1389b3f]
2012-07-03 23:20:14 [DEBUG](org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:42) ==> Preparing: select b.*, bt.type_no as "type.id" , bt.type_dsc "type.name", bt.show "type.show", bt.del "type.del" from book b,book_type bt where b.type_no=bt.type_no and bt.del=0 and b.del=0 and (( lower(title) like ? ) or ( lower(content) like ? )) order by bt.show desc,b.type_no,b.id
2012-07-03 23:20:14 [DEBUG](org.apache.ibatis.logging.commons.JakartaCommonsLoggingImpl:42) ==> Parameters: %aaaaaaaa%(String), %aaaaaaaa%(String)
2012-07-03 23:20:14 [ERROR](frame.FrmMainI:1018) org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
### The error may involve book.note.findByTypeTitleContent-Inline
### The error occurred while setting parameters
### Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
org.apache.ibatis.exceptions.PersistenceException:
### Error querying database. Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
### The error may involve book.note.findByTypeTitleContent-Inline
### The error occurred while setting parameters
### Cause: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
at org.apache.ibatis.exceptions.ExceptionFactory.wrapException(ExceptionFactory.java:23)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:104)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:95)
at dao.AbsBaseIbatisDAO.selectList(AbsBaseIbatisDAO.java:96)
at dao.NoteDAO.findByTypeTitleContent(NoteDAO.java:19)
at bo.BookBO.findNoteByTypeTitleContent(BookBO.java:118)
at frame.FrmMainI.search(FrmMainI.java:1011)
at frame.FrmMainI$28.keyReleased(FrmMainI.java:839)
at java.awt.Component.processKeyEvent(Component.java:6249)
at javax.swing.JComponent.processKeyEvent(JComponent.java:2801)
at java.awt.Component.processEvent(Component.java:6065)
at java.awt.Container.processEvent(Container.java:2041)
at java.awt.Component.dispatchEventImpl(Component.java:4651)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.KeyboardFocusManager.redispatchEvent(KeyboardFocusManager.java:1850)
at java.awt.DefaultKeyboardFocusManager.dispatchKeyEvent(DefaultKeyboardFocusManager.java:712)
at java.awt.DefaultKeyboardFocusManager.preDispatchKeyEvent(DefaultKeyboardFocusManager.java:990)
at java.awt.DefaultKeyboardFocusManager.typeAheadAssertions(DefaultKeyboardFocusManager.java:855)
at java.awt.DefaultKeyboardFocusManager.dispatchEvent(DefaultKeyboardFocusManager.java:676)
at java.awt.Component.dispatchEventImpl(Component.java:4523)
at java.awt.Container.dispatchEventImpl(Container.java:2099)
at java.awt.Window.dispatchEventImpl(Window.java:2478)
at java.awt.Component.dispatchEvent(Component.java:4481)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:643)
at java.awt.EventQueue.access$000(EventQueue.java:84)
at java.awt.EventQueue$1.run(EventQueue.java:602)
at java.awt.EventQueue$1.run(EventQueue.java:600)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:98)
at java.awt.EventQueue$2.run(EventQueue.java:616)
at java.awt.EventQueue$2.run(EventQueue.java:614)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.AccessControlContext$1.doIntersectionPrivilege(AccessControlContext.java:87)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:613)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Caused by: org.firebirdsql.jdbc.FBSQLException: GDS Exception. 335544569. Dynamic SQL Error
SQL error code = -303
arithmetic exception, numeric overflow, or string truncation
No message for code 335544914 found.
at org.firebirdsql.jdbc.AbstractPreparedStatement.internalExecute(AbstractPreparedStatement.java:730)
at org.firebirdsql.jdbc.AbstractPreparedStatement.execute(AbstractPreparedStatement.java:663)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:597)
at org.apache.ibatis.logging.jdbc.PreparedStatementLogger.invoke(PreparedStatementLogger.java:58)
at $Proxy1.execute(Unknown Source)
at org.apache.ibatis.executor.statement.PreparedStatementHandler.query(PreparedStatementHandler.java:57)
at org.apache.ibatis.executor.statement.RoutingStatementHandler.query(RoutingStatementHandler.java:70)
at org.apache.ibatis.executor.SimpleExecutor.doQuery(SimpleExecutor.java:57)
at org.apache.ibatis.executor.BaseExecutor.queryFromDatabase(BaseExecutor.java:267)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:141)
at org.apache.ibatis.executor.BaseExecutor.query(BaseExecutor.java:124)
at org.apache.ibatis.session.defaults.DefaultSqlSession.selectList(DefaultSqlSession.java:101)
... 40 more
And mybatis sql defination:
<select id="findByTypeTitleContent" parameterType="map" resultMap="booknoteMap">
select
b.*,
bt.type_no as "type.id" ,
bt.type_dsc "type.name",
bt.show "type.show",
bt.del "type.del"
from
book b,book_type bt
where
b.type_no=bt.type_no
and bt.del=0
and b.del=0
<if test="typeNos!=null">
and b.type_no in (
<foreach collection="typeNos" item="t" separator=",">
#{t.id}
</foreach>
)
</if>
<if test="keys!=null">
and ((
<foreach collection="keys" item="key" separator="and" >
lower(title) like #{key}
</foreach>
) or (
<foreach collection="keys" item="key" separator="and" >
lower(content) like #{key}
</foreach>
))
</if>
<choose >
<when test="typeNo>0">
order by bt.show desc, b.id
</when>
<otherwise>
order by bt.show desc,b.type_no,b.id
</otherwise>
</choose>
</select>
I did more test and discovered that title like is ok no matter how long the keyword,content like cause the error when the length is bigger than 5.
title column is varchar(100),content is Blob sub_type 1
, but anyway it’s totally fine in sql console which makes me so confused, error just happens when running in java
Any ideas? It’s been a long time.
- Стандартные отчёты
- Почему вообще могут возникнуть ошибки?
- Пример отчета
- Отчет завершился ошибкой «Column unknown»
- Отчет завершился ошибкой «Token unknown»
- Отчет выполнился, но записи только «None»
- Отчет завершился ошибкой «arithmetic exception, numeric overflow, or string truncation»
- В выгрузке нет ни одной записи
- При выполнении отчета ошибка «not enough arguments for format string»
- При выполнении отчета возникла ошибка «Произошла ошибка по адресу http://***/admin/reports/AdminCustomReports/250001/executesql/
- Я не могу найти ошибку. Что делать?
Стандартные отчёты
В состав биллинга входит набор стандартных отчётов. Если у Вас возникла проблема с одним из них то:
- Возможно в отчёте уже есть нужные исправления. Скопируйте свежую версию отчёта к себе на биллинг из демонстрационной базы данных https://demo5.carbonsoft.ru/admin/reports/AdminCustomReports/
Для доступа к демо базе авторизуйтесь на странице - Если в свежей версии отчёта также есть ошибка обратитесь в техническую поддержку
Почему вообще могут возникнуть ошибки?
Отчеты из статей ориентированы на стандартный набор реквизитов и их параметры. Чем отчет больше, тем выше вероятность допустить ошибку в какой-нибудь мелочи. Работая над большими отчетами, вероятней всего, придется потратить какое-то время на их отладку.
Пример отчета
Допустим, проблема с отчетом выгрузки карточек абонентов
select a.nakme || ';' || 'Создан: ' || a.activate_date || ';' || h.city || ', ' || h.street || ', ' || h.s_number || ';' || t.name uf_ip2string(u.ip) from abonents a join attribute_values av_addr on a.id=av.abonent_id and av.attribute_id=3 join homes h on av_addr.attribute_value=h.id join tarif t on a.tarif_id=t.id where a.deleted=0
Отчет не выполнится, разберём почему.
Отчет завершился ошибкой «Column unknown»
Ошибка «Column unknown» говорит о том, что в структуре отчета Вы пытаетесь получить данные из несуществующей колонки.
Причин может быть несколько.
Орфографическая ошибка
Ошибка в алиасах
Column unknownn- AV.ABONENT_IDn- At line 8, column 51
При соединении таблиц abonents и attribute_values мы дали им «алиасы», чтобы проще и короче писать наименования полей
- abonents — a
- attribute_values — av_addr
Но при указании условий объединения таблиц, мы используем неправильный алиас для attribute_values — av
on a.id=av.abonent_id and av.attribute_id=3
Чтобы исправить, замените исправьте алиас:
on a.id=av_addr.abonent_id and av_addr.attribute_id=3
Ошибка в имени поля
Так же ошибку вызовет поле a.nakme — в нем лишняя буква «k», правильно a.name — потому что так оно называется в таблице ABONENTS, из которой отчёт берёт данные.
Логическая — поля действительно не существует
Column unknownn- U.IPn- At line 6, column 20'
Исправив ошибку алиаса, мы получаем новую и тоже «Column unknown». Поле которое его вызвало — u.ip. Если посмотреть набор таблиц, которые мы объединяем, то таблицы учетных записей users мы там не найдем. Для исправления присоедините эту таблицу:
from abonents a join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3
from abonents a join users u on a.id=u.abonent_id join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3
Отчет завершился ошибкой «Token unknown»
Token unknown - line 6, column 17
Таблицу Users добавили, но опять ошибка в 6 строке. Проблему вызвало то, что после t.name пропущен операнд объединения строк || (или запятая, если строится для конструктора, а не для СОРМ). Исправим:
t.name uf_ip2string(u.ip)
t.name || ';' || uf_ip2string(u.ip)
Отчет выполнился, но записи только «None»
Если появляются записи «None», значит есть абоненты попадающие в выборку, но данные, которые мы пытаемся получить, не заполнены. В таком случае СУБД в ответ на запрос отвечает «null» или «none».
Для решения проблемы используйте конструкцю coalesce, задавая какое-то «стандартное» значаение, оно будет выводиться вместо None.
'Создан: ' || a.activate_date || ';' ||
'Создан: ' || coalesce(a.activate_date,'1970-01-01 00:00:01') || ';' ||
Отчет завершился ошибкой «arithmetic exception, numeric overflow, or string truncation»
Отчёт опять завершится ошибкой, но уже другой: «arithmetic exception, numeric overflow, or string truncation«. Она говорит о том, что мы пытамся производить операции над данными разных типов, что в ряде случаев пройдет успешно и СУБД произведёт конверсию автоматический, но не всегда.
Чтобы решить проблему, все данные приведём к единому типу: текст. Преобразуем a.activate_date в строковый формат, чтобы СУБД могла правильно объединить его с остальным текстом:
Если взять пример где все записи были «None» и убрать оттуда предварительную конверсию даты в строку, вот так:
'Создан: ' || coalesce(a.activate_date,'1970-01-01 00:00:01') || ';' ||
'Создан: ' || coalesce(cast(a.activate_date as varchar(32)),'1970-01-01 00:00:01') || ';' ||
В выгрузке нет ни одной записи
Причин может быть две:
- По условиям запроса и правда нет данных
- При объединении таблиц, в одной из них не оказалось искомых записей
По условиям запроса и правда нет данных
Попробуйте взять контрольного абонента, в конец условий добавить его ID:
where a.deleted=0 and a.id=12345
И постепенно убирать дополнительные условия.
При объединении таблиц, в одной из них не оказалось искомых записей
Попробуйте заменить объединения через JOIN на LEFT JOIN (о разницы между ними Вы можете почитать в справке по оператору в Википедии)
join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 join homes h on av_addr.attribute_value=h.id
left join attribute_values av_addr on a.id=av_addr.abonent_id and av_addr.attribute_id=3 left join homes h on av_addr.attribute_value=h.id
Если данных в таблицах много, LEFT JOIN может существенно замедлить выполнение отчета. |
При выполнении отчета ошибка «not enough arguments for format string»
Такая ошибка может возникнуть если в отчете допущена любая ошибка, и при этом в тексте отчета есть символ процента «%» или другие спецсимволы.
Ниже приведены несколько примеров как решить такую проблему.
Параметры заполнения формы
Если Вы сделали отчет для выполнения в конструкторе отчетов и добавили в форму параметры для заполнения («Параметры полей формы«), то их нужно убрать чтобы увидеть реальную ошибку отчета.
Чтобы найти проблему:
- Замените все заполняемые параметры статическими, например:
BILL_DATE between ':1-Начало|date$' and ':2-Конец|date$'
BILL_DATE between '2019-10-01' and '2019-10-31'
- Выполните отчет и в выводе будет описана настоящая ошибка.
Символ «%»
Если где-либо в отчёте Вы используете символ процента «%», его тоже необходимо убрать:
- Возможно Вы используете оператор «LIKE» чтобы найти подходящие строки, например:
when ABONENTS.NAME like '%Васильев%'
Его можно заменить на оператор «CONTAINING» получив приблизительно тот же эффект
when ABONENTS.NAME containing 'Васильев'
В любом случае, исправив основную ошибку отчета, форму LIKE можно будет вернуть.
- Еще возможный вариант — Вы вывводите символ процента чтобы обозначить что в столбце отображаются именно проценты, например:
select '3% суммы всех платежей: ' sum(OP_SUMMA)/100*3 from FINANCE_OPERATIONS where OP_TYPE=2
Просто уберите из отчета символ процента и в данном отчете увидите ошибку «arithmetic exception…»:
select '3 процента суммы всех платежей: ' sum(OP_SUMMA)/100*3 from FINANCE_OPERATIONS where OP_TYPE=2
После исправления основной ошибки отчета, символ процента можно будет вернуть.
При выполнении отчета возникла ошибка «Произошла ошибка по адресу http://***/admin/reports/AdminCustomReports/250001/executesql/
В описании ошибки будет запись следующего вида:
DjangoUnicodeDecodeError: 'utf8' codec can't decode byte 0xd0 in position 30: unexpected end of data. You passed in 'xd0x92......' (<type 'str'>)
Причиной данной ошибки является превышение количества символов при наименовании столбца кирилицей в итоговом отчете. Поле может иметь название не более 18 символов.
Пример:
s_time as "Время начала звонка"
Для решения проблемы, если используете кирилицу — сократите название, либо укажите наименование латиницей.
Я не могу найти ошибку. Что делать?
Локализуйте проблему. Максимально упростите запрос и постепенно добавляйте объединения таблиц, или наоборот — постепенно удаляйте поля из исходного запроса.
Например
- Упростите начальный запрос до такого:
select a.nakme from abonents a
Отчет завершится с ошибкой «Column unknown» — еще раз прочитав запроса вероятно станет понятно, что скорей всего поля «nakme» не существует и в нем лишний символ.
- Исправив ошибку в поле a.name, добавьте еще одно поле из исходного запроса:
select a.name || ';' || 'Создан: ' || a.activate_date || ';' || from abonents a
Отчет завершится ошибкой «Token unknown», так как последнее поле завершается оператором объединения строк.
- Приведите отчет к рабочему виду:
select a.name || ';' || 'Создан: ' || a.activate_date from abonents a
В выводе будет множество полей «None». Причина — заведено множество еще не активированных абонентов + в вывод попали папки, когда хотели получить только абонентов. Исправьте:
select a.name || ';' || 'Создан: ' || coalesce(cast(a.activate_date as varchar(32)),'1970-01-01 00:00:01') from abonents a where a.is_folder=0
И так далее, пока не восстановите полную структуру начального отчета.
Господа помогите разобраться… пишу:
Код:
string myConnString = db.GetConnString();
string myUpdate = «insert into members (member_id, fio, DOLJNOST,DEPORT, BEGINWORK) values (gen_id (gen_members_id,1), ‘» + FioBox.Text.ToString() + «‘,'» + PoscomboBox.Text.ToString() + «‘, ‘» + s + «‘, ‘» + AmissionDate.Text.ToString() + «‘)»; ;
FbConnection myConnection = new FbConnection(myConnString);
myConnection.Open();
FbTransaction myTxn = myConnection.BeginTransaction();
FbCommand myCommand = new FbCommand(myUpdate,myConnection, myTxn);
myCommand.ExecuteNonQuery();
myTxn.Commit();
myConnection.Close();
При выполнении получаю ошибку
(arithmetic exception, numeric overflow, or string truncation)
указывающую на ExecuteNonQuery()
В чем проблема понять не могу…
4 ответа
713
29 ноября 2006 года
Ap0k
360 / / 13.03.2006
В ADO.NET поддерживается передача параметров в запросах к БД. Не знаю как там в FireBird, думаю в провайдере для этой СУБД это предусмотрено.
Код:
string myConnString = db.GetConnString();
string myUpdate = «INSERT INTO members (member_id, fio, DOLJNOST,DEPORT, BEGINWORK) VALUES (gen_id (gen_members_id,1),@surname,@post, @dept,@some_date)»; ;
FbConnection myConnection = new FbConnection(myConnString);
myConnection.Open();
FbTransaction myTxn = myConnection.BeginTransaction();
FbCommand myCommand = new FbCommand(myUpdate,myConnection, myTxn);
myCommand.Parameters.Add(new FbParameter(«@surname»,FioBox.Text)); //Зачем у String вызывать ToString()?
myCommand.Parameters.Add(new FbParameter(«@post»,PoscomboBox.Text));
/*
в данном случае должности стоило бы хранить в отдельной таблицы для нормализации.
а в members сохранять идентификатор должности. (если бы использовался не ComboBox
вопросов бы наверно не возникло.
*/
myCommand.Parameters.Add(new FbParameter(«@dept»,s));//Что есть «s» ?
myCommand.Parameters.Add(new FbParameter(«@some_date»,AmissionDate.Text)); //Пусть будет так… если ты хранишь даты как строку (??)
//иначе используй DateTimePeaker.
myCommand.ExecuteNonQuery();
myTxn.Commit();
myConnection.Close();
Кажется стоило бы поучить мат. часть.
PS: gen_id(gen_members_id,1) это генерация первичного ключа???
20K
29 ноября 2006 года
Hill
9 / / 22.11.2006
Спаси бо за ответ…=) Я разобрался сам… Просто мозг в тот момент вообще не думал я не мог понять в чем прикол…
Так теперь по пунктам=)
To что я у string вызывал ToString() это реально глупость… устранил
Для ввода должности я убрал ComboBox ибо отдельную таблицу делать не буду..
Да дата у меня хранится в строке и мне так удобно… в моём случае это не критично.. да я использую DateTimePeaker
И gen_id(gen_members_id,1) это действительно генерация первичного ключа… а что в этом удевительного?
713
29 ноября 2006 года
Ap0k
360 / / 13.03.2006
Разве Firebird не поддерживает автоинкремент ключевых полей?
тогда запрос упростился бы…
Код:
string myUpdate = «INSERT INTO members (fio, DOLJNOST,DEPORT, BEGINWORK) VALUES (@surname,@post, @dept,@some_date)»;
при этом идентификатор автоматически бы сгенерировался.
52K
05 августа 2009 года
fedorrb
1 / / 05.08.2009
Рабочий пример для доступа к БД Firebird из Visual C# 2008 express edition. Реализовано ссылочная целостность. Вызов хранимой процедуры с возвратом значения, Select, Insert, dataGridView. Все в архиве. Строго не судите, три года не программировал. Неделю собирал информацию в сети.
В архиве нет файла FirebirdSQL.Data.FirebirdClient.dll
3 / 3 / 1 Регистрация: 16.02.2011 Сообщений: 157 |
|
1 |
|
17.03.2015, 06:55. Показов 2809. Ответов 4
Работаю в C# с базой Firebird. Есть таблица с полем типа varchar, кодировкой Win1251 и установленной длинной 2000. При изменении именно в этом поле некоторые записи выдают ошибку firebird arithmetic exception, numeric overflow, or string truncation Не пойму, в чем проблема. P.S. Вот что я заметил. Если в поле общая длина составляет больше 1036 символов, то при запросе на изменение и выходит эта ошибка.
0 |
1449 / 1121 / 346 Регистрация: 11.04.2011 Сообщений: 2,621 |
|
17.03.2015, 08:22 |
2 |
Serpico, Ошибка однозначано связано с тем, что строка не влезает в поле (string truncation). Вопрос остается только в том, почему так происходит. На этот вопрос, не видя кода, ответить невозможно.
0 |
Serpico 3 / 3 / 1 Регистрация: 16.02.2011 Сообщений: 157 |
||||
17.03.2015, 08:38 [ТС] |
3 |
|||
kodv, хорошо вот что я делаю
0 |
1449 / 1121 / 346 Регистрация: 11.04.2011 Сообщений: 2,621 |
|
17.03.2015, 09:02 |
4 |
Serpico, у вас, скорее всего, @pakets автоматически (в конструкторе FbParameter) получает тип NVARCHAR (string в C# — это строка UNICODE), в котором каждый символ занимает 2 байта. В базе поле ‘PAKETS’ имеет тип VARCHAR, где каждый символ занимает 1 байт. То есть, если ваша строка ссодержит более 1000 символов, то значение параметра @pakets занимает более 2000 байт. Вы либо в базе измените тип поля ‘PAKETS’ с VARCHAR на NVARCHAR, либо указывайте тип явно при создании параметра @pakets.
0 |
3 / 3 / 1 Регистрация: 16.02.2011 Сообщений: 157 |
|
17.03.2015, 09:09 [ТС] |
5 |
kodv, в базе Firebird нет NVARCHAR. Там только VARCHAR, да и проверял я он автомат правильно выставляет тип.
0 |
Работаю в C# с базой Firebird. Есть таблица с полем типа varchar, кодировкой Win1251 и установленной длинной 2000.
При изменении именно в этом поле некоторые записи выдают ошибку
firebird arithmetic exception, numeric overflow, or string truncation
string right truncation
Не пойму, в чем проблема.
P.S. Вот что я заметил. Если в поле общая длина составляет больше 1036 символов, то при запросе на изменение и выходит эта ошибка.
Сам код :
using (FbConnection con = new FbConnection(ConString))
{
con.Open();
string sql = "UPDATE OR INSERT INTO 'PARTS' ('ID','PART','DATAOTGR','CONTRACT','MBRUTTO','MNETTO','EXPORTED','PAKETS') n" +
"VALUES (@id,@part,@dataotgr,@contract,@mbrutto,@mnetto,@exported,@pakets) n" +
"matching (id);";
FbCommand InsertSQL = new FbCommand(sql, con);
FbParameter param; //создаем параметр
param = new FbParameter("@ID", obj.id.ToString()); //добавляем значения и имя
InsertSQL.Parameters.Add(param); //теперь добавляем параметр к комманде
param = new FbParameter("@PART", obj.part1); //и дальше так же только и меняем что значения
InsertSQL.Parameters.Add(param);
param = new FbParameter("@dataotgr", obj.dataOtgr); param.FbDbType = FbDbType.Date;
InsertSQL.Parameters.Add(param);
param = new FbParameter("@contract", obj.contract);
InsertSQL.Parameters.Add(param);
param = new FbParameter("@MBRUTTO", obj.mBrutto);
InsertSQL.Parameters.Add(param);
param = new FbParameter("@MNETTO", obj.mNetto);
InsertSQL.Parameters.Add(param);
//не соответствие типов и бла-бла-бла. преобразуем bool в string, в самой базе CHAR(1)
string exp = obj.exported ? "1" : "0";
param = new FbParameter("@exported", exp);
InsertSQL.Parameters.Add(param);
param = new FbParameter("@pakets", obj.pakets); //АГА! вот оно проблемное поле. обычно длина строки obj.pakets более 1000 символов.
InsertSQL.Parameters.Add(param);
FbTransaction fbt = con.BeginTransaction(); //стартуем транзакцию
InsertSQL.Transaction = fbt; // проинициализация транзакции для объекта InsertSQL
int res = InsertSQL.ExecuteNonQuery(); //нуу ... сам запрос отправляем
fbt.Commit(); //если вставка прошла успешно - комитим транзакцию
con.Close(); //закрываем соединение
}