【问题标题】:Trapping Exception using TSQLQuery & params使用 TSQLQuery 和参数捕获异常
【发布时间】:2010-12-08 19:51:27
【问题描述】:

我收到“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 导致了错误?

【问题讨论】:

  • 没有看到这些参数和查询很难说。

标签: sql sql-server delphi tsql exception


【解决方案1】:

在参数替换后获取 SQL 文本并在 SQL Server 管理工作室中将其作为查询运行。
您将能够从那里对其进行调试。

【讨论】:

    【解决方案2】:

    当你有表的元数据时,检查字符串字段的最大长度。调试时,检查您提供参数名称的字符串的长度。还要检查数字字段的类型,并确保不超过最大值。 (我曾经遇到过这个问题,字符串的长度超过了表中的 varchars 长度,并且我尝试将 smallint 数据库字段设置为过高的值)

    【讨论】:

      【解决方案3】:

      您正在尝试将字符串值插入到不足以容纳该值的字段中。对照表中字段的长度检查您要插入的值的长度。

      【讨论】:

      • 这是列出的三种可能性之一。阅读 OP 收到的错误消息会给你另外两个。
      【解决方案4】:

      正如其他人所说,几乎可以肯定的是,您将太大的字符串推入您的某个字段。它也可能发生在数值上,但它最有可能是一个字符串。

      我建议您使用文本常量临时更改每个 ParamByName('').AsString:=blah 行,例如;

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

      等,看看你是否得到错误。如果它通过没有错误,那么您的问题很可能是您的字符串参数之一太长。检查您的表架构并调试您放入参数中的实际字符串。

      根据您对此拥有多少访问权限(和经验),您可能会发现打开 SQL Server 日志记录会更有帮助,这样您可以在被处理时看到您的查询(以及这些参数的内容) SQL 服务器。这将准确地向您显示实际提供给服务器的字符串和数值。 您使用的是哪个版本的 SQL Server?

      【讨论】:

        猜你喜欢
        • 2017-12-27
        • 2010-09-16
        • 2013-06-24
        • 1970-01-01
        • 1970-01-01
        • 2017-07-14
        • 2013-03-24
        • 2012-10-20
        • 1970-01-01
        相关资源
        最近更新 更多