从SQL查询中获取无意义的结果

时间:2009-06-06 08:23:31

标签: sql sql-server-2005 ado.net

我的申请中遇到了非常非常奇怪的情况。我说奇怪,因为错误 intermitent ,我无法找出它们发生的原因。

我将sqlcommand传递给DB(Sql 2005),尝试从单个表中获取bigint(列ID_Facultate)。问题是我有一个字符串(一些讲座的名称)与我试图访问的表格无关。

另外,当我收到这些错误时,所有我的应用程序会变得疯狂。

在SQL Profiler中,一切似乎都很好(最后执行的行似乎是我的应用程序发送的行)

以下是错误期间3个捕获屏幕的链接以及我使用过的代码。请注意Watch1的非常错误的字符串值,我期望一些整数

更新

我会考虑同时使用列名和/或ExecuteScalar。

然而,问题是,如Watch1所示,查询返回的值与该表无关。

代码期望一个整数(14),而DB返回一个字符串......(http://www.unitbv.ro/cata/errors/2.jpg) 同样在http://www.unitbv.ro/cata/errors/3.jpg:我期待一个从1到20的值,而DB /层似乎返回值305,该表中的 ......

在接下来的帖子(各种论坛)中,我问了相同或相关的问题(还没有正面答案)

5 个答案:

答案 0 :(得分:1)

从您的代码中我只能想到使用字段名称来获取值。

rd["ID_Facultate"].ToString()

虽然您的代码看起来是正确的,但我总是更喜欢使用字段名来获取值而不是索引位置,这可以在很多情况下轻松更改。其中一些,也许就像这一个,你甚至无法弄明白。

答案 1 :(得分:0)

你能想到为什么idr.FieldCount在屏幕1和2中的值为4,但在屏幕3中只有3。可以通过使用列名而不是序数位来解决问题吗?

id_faculate = long.Parse(idr["ColumnName"].ToString());

答案 2 :(得分:0)

由于您只获得1个值,因此您应该考虑使用SqlCommand.ExecuteScalar而不是DataReader

答案 3 :(得分:0)

从你告诉我们的一切来看,似乎没有错。这可能是你没有给我们提供信息的其他东西。

其他一些尝试:

  • 运行DBCC CHECKDB
  • 确保查询在SQL Server Management Studio中返回正确的结果
  • 在另一台计算机/ SQL实例上尝试数据库,看看是否存在相同的问题

答案 4 :(得分:0)

这可能是一个盲目的途径...但您的上下文是一个Web应用程序?您使用的是旧的EntLib版本(4或更低版本)吗?

EntLib 4(及更早版本)版本中存在一个已知错误,该错误可能会在IIS上托管的ASP.NET应用程序的上下文中承受重负。我不记得所有细节,但基本上IIS有一个优化,在重负载下,它可能在等待期间“停放”一个线程(释放它以便它可以用于其他东西),然后尝试当I / O等待结束时,继续在实际上是另一个线程上运行相同的LOGICAL线程。

如果您正在进行大量数据访问,这会产生您看到的症状 - 一个查询的结果最终会在运行完全不同的查询的线程中收到。

如果您没有使用EntLib,请检查您自己的代码是否包含相同的错误。查找[ThreadStatic]属性 - 当IIS决定将逻辑迁移到另一个线程时,IIS不会处理这些属性!

谷歌搜索“IIS线程敏捷性”应该会提供更多信息。

一些可能有用的链接:

http://piers7.blogspot.no/2005/11/threadstatic-callcontext-and_02.htmlhttp://blog.idm.fr/2010/03/aspnet-thread-agility-or-why-threadstatic-should-not-be-used.html