Исключение ловушек с использованием TSQLQuery & params - PullRequest
3 голосов
/ 21 октября 2009

Я получаю сообщение об ошибке «Ошибка SQL Server: арифметическое исключение, переполнение числа или усечение строки»

вот код ниже

AQuery:= TSQLQuery.Create(nil);
with AQuery do
begin
SQLConnection:- AConnection;
 SQL.Text:= 'Insert into.....';
 ParamByName('...').asString:= 'PCT';
 .
 .
 .

 try
  ExecSQL;
 finally
  AQuery.Free;
 end;
end;

У меня много строк ParamByName, и я не могу понять, какая из них выдает исключение. Я просто знаю, что он брошен в строку ExecSQL. Как я могу сказать, какое paramByName вызывает ошибку?

Ответы [ 4 ]

2 голосов
/ 21 октября 2009

Если у вас есть метаданные таблицы, проверьте максимальную длину строковых полей. При отладке проверьте длину строк, которые вы передаете названиям парамбина. Также проверьте тип числовых полей и убедитесь, что вы не превышаете максимальное значение. (Однажды у меня была эта проблема со строкой, длина которой превышала длину varchars в таблице, и у меня была эта проблема с полем базы данных smallint, которое я пытался установить на слишком высокое значение)

1 голос
/ 21 октября 2009

Получить текст SQL после подстановки параметров и запустить его как запрос в среде управления SQL Server.
Вы сможете отлаживать его оттуда.

0 голосов
/ 22 октября 2009

Как уже говорили другие, почти наверняка вы помещаете слишком большую строку в одно из ваших полей. Это также может произойти с числовыми значениями, но, скорее всего, это будет строка.

Я бы посоветовал вам временно изменить каждое из ваших ParamByName (''). AsString: = бла строки с текстовой константой, например;

ParamByName('surname').AsString:='Smith';
ParamByName('firstname').AsString:='John';

и т. Д., И посмотрите, получите ли вы ошибку. Если он проходит без ошибок, то, скорее всего, ваша проблема в том, что один из ваших строковых параметров слишком длинный. Проверьте схему таблицы и отладьте фактические строки, которые вы вводите в параметры.

В зависимости от того, какой доступ (и опыт) у вас есть к этому, может оказаться более полезным включить ведение журнала SQL Server, чтобы вы могли видеть ваши запросы (и содержимое этих параметров), когда обработка обрабатывается SQL-сервер. Это покажет вам, какие именно строковые и числовые значения фактически передаются на сервер. Какую версию / редакцию SQL Server вы используете?

0 голосов
/ 22 октября 2009

Вы пытаетесь вставить строковое значение в поле, которое недостаточно велико для хранения значения. Сравните длину значений, которые вы вставляете, с длиной поля в таблице.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...