2009-12-11 91 views
9

我正在一个名为Telligent的社区平台上进行集成。我正在使用称为BlogML的第三方插件将博客帖子从XML文件(以BlogML格式)导入我的本地Telligent站点。 Telligent平台在其SDK中附带了许多类,以便我可以通过编程添加内容,例如博客帖子。例如。SQL错误:字符串或二进制数据将被截断

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. 

我相信这个错误意味着,我想太多的数据插入到具有最大大小限制数据库字段。不幸的是,我不知道哪个领域是个问题。我在执行导入时运行了SQL Server Profiler,但我似乎无法看到发生错误的存储过程。是否有另一种方式使用探查器或其他工具来查看确切的存储过程以及错误是由什么字段造成的?是否有任何其他提示可以获得有关专门查找的更多信息?

哦第三方工具的乐趣...

+1

发生错误时,是否撤消已导入的所有博客文章?如果没有,也许你可以知道哪个记录失败(最后一个记录成功后的下一个记录)并查看。如果导入工具具有任何类型的日志记录或导入记录的计数器,那么这将是另一个需要查看的地方。 – 2009-12-11 15:40:12

+0

@Tom H.这个帖子成功了。我已经完成了你在最后一次成功之后看帖子的内容。我确实怀疑帖子主体对于db单元来说太大了,但是body字段是'ntext',并且我没有看到比我预期的时间长的其他可疑的XML节点。我会再看一遍,因为这是目前我唯一已知的调试此问题的方法。感谢您的评论。 – 2009-12-11 15:43:18

回答

18

您在该异常是由于试图太多数据塞进一个字符/二进制基于现场正确。运行跟踪绝对应该让你看到哪些程序/语句被抛出,如果你捕获正确的事件之外,那些你想捕捉将包括:

  1. SQL:BatchStarting
  2. SQL:BatchCompleted
  3. SQL:StmtStarting
  4. SQL:StmtCompleted事件
  5. RPC:启动
  6. RPC:完成
  7. SP:启动
  8. SP:已完成
  9. SP:StmtStarting
  10. SP:StmtCompleted事件
  11. 异常

如果您知道某些它包括故障码存储过程,你可以用捕捉废除#的1-4。请确保您也捕获跟踪中的所有相关列(如果使用Profiler工具运行跟踪,应该是默认值)。 Exception类将包含跟踪中的实际错误,这将允许您在抛出异常的同一个SPID内查看前面的语句。除了已完成的事件之外,您必须包括起始事件,因为发生的异常会阻止跟踪中关联的已完成事件触发。

如果您可以将跟踪过滤到特定的数据库,应用程序,主机名等,如果您位于繁忙的服务器上,它肯定会使其更易于调试,但是如果您处于空闲服务器上,则可能不需要烦扰过滤。

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

这里是我拍摄的轮廓的屏幕截图复制与你相似的事件:

alt text http://i47.tinypic.com/1zc01mo.jpg

你可以看到红色的例外线,线强调的是即时前面SP:StmtStarting在相同SPID的例外之前触发的事件。如果你想找到这个语句所包含的存储过程的一部分,请在ObjectName和/或ObjectId列中查找值。

+3

不可思议。我花了大约4天时间来解决这个问题。我添加了像你所说的其他事件,并找到了失败的正确SP语句。我发现“主题”和“作者”字段太短,只能成功导入700多篇博文。如果可以的话,我会给你我所有的代表点。 – 2009-12-11 19:21:36

+0

太棒了,很高兴帮助! – chadhoc 2009-12-11 19:51:33

+0

乍得是我的heeerooooo – Jason 2009-12-11 20:33:03

0

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

如果您尝试插入类似的字符串。

String reqName="Food Non veg /n"; 

这里/ n是culprit.Remove/n的字符串来摆脱这种错误的。

我希望这对一些人有帮助。

相关问题