10

我正在一个名为 Telligent 的社区平台上进行集成。我正在使用名为 BlogML 的第 3 方插件将博客文章从 XML 文件(BlogML 格式)导入我的本地 Telligent 站点。Telligent 平台在其 SDK 中附带了许多类,因此我可以以编程方式添加内容,例如博客文章。例如

myWeblogService.AddPost(myNewPostObject);

我使用的 BlogML 应用程序本质上是解析 XML 并创建博客文章对象,然后使用类似上述示例行的代码将它们添加到站点。大约 40 次导入后,我得到一个 SQL 错误:

Exception Details: System.Data.SqlClient.SqlException:
String or binary data would be truncated.
The statement has been terminated.

我相信这个错误意味着我正在尝试将太多数据插入到具有最大大小限制的 db 字段中。不幸的是,我无法确定这是哪个领域的问题。我在导入时运行了 SQL Server Profiler,但我似乎看不到错误发生在哪个存储过程上。是否有另一种方法可以使用分析器或其他工具来准确查看存储过程,甚至错误是由哪个字段引起的?是否有任何其他提示可以获取有关具体看哪里的更多信息?

哦,第 3 方工具的乐趣……

4

2 回答 2

19

您是正确的,因为异常是由于试图将太多数据填充到基于字符/二进制的字段中。如果您正在捕获正确的事件,那么运行跟踪绝对可以让您查看哪个过程/语句引发了异常,您想要捕获的事件包括:

  1. SQL:批量启动
  2. SQL:批处理完成
  3. SQL:Stmt开始
  4. SQL:Stmt 已完成
  5. RPC:开始
  6. RPC:已完成
  7. SP:开始
  8. SP:已完成
  9. SP:StmtStarting
  10. SP:Stmt 已完成
  11. 例外

如果您确定这是一个包含错误代码的存储过程,您可以取消捕获 # 的 1-4。确保您也捕获了跟踪中的所有关联列(如果您使用 Profiler 工具运行跟踪,则应该是默认列)。Exception 类将在您的跟踪中包含实际错误,这应该允许您在引发异常的同一个 SPID 中查看前一个语句。除了已完成的事件之外,您还必须包括启动事件,因为发生的异常将阻止关联的已完成事件在跟踪中触发。

如果您可以将跟踪过滤到特定的数据库、应用程序、主机名等,如果您在繁忙的服务器上,这肯定会使调试更容易,但是如果您在空闲的服务器上,您可能不需要费心过滤。

假设您使用的是 Sql 2005+,跟踪将包含一个名为“EventSequence”的列,它基本上是按事件触发的顺序排序的递增值。运行跟踪并捕获输出后,找到触发的“异常”事件(如果您使用分析器,该行将显示为红色),那么您应该能够简单地找到最新的 SP:StmtStarting 或SQL:StmtStarting 事件发生在异常之前发生的相同 SPID。

这是我捕获的个人资料的屏幕截图,它再现了与您类似的事件:

替代文字

您可以看到红色的异常行,突出显示的行是紧接在前面的 SP:StmtStarting 事件,该事件在同一 SPID 的异常之前触发。如果要查找此语句所属的存储过程,请在 ObjectName 和/或 ObjectId 列中查找值。

于 2009-12-11T18:31:59.077 回答
1

通过做一些愚蠢的错误,你会得到这个错误。

如果你想插入一个字符串,比如。

String reqName="Food Non veg /n";

这里 /n 是罪魁祸首。从字符串中删除 /n 以摆脱此错误。

我希望这会对某人有所帮助。

于 2016-07-25T09:36:22.487 回答