我们遇到了一些随机的 FormatExceptions,这些异常与几个数据库查询有关。经过进一步的日志记录,我发现在今天早上,下面的查询返回了字符串 "gladiator"。Website.PkID 是一个 int 列,大多数情况下都能正常工作,但有时会失败,并返回一个比任何有效 WebsiteID 都要大得多的 int,或者是一个随机字符串。
这个特定的查询每次会话开始时都会被调用一次。它没有使用共享连接,所以我很难理解它为什么会得到如此混乱的结果。连接池中可能存在某种类型的损坏吗?
我认为问题不仅限于这个查询。我还看到类似的 FormatExceptions(由于意外的结果)来自于 LINQ 查询。我们也在同一时间发现了一些这样的错误:
“在向服务器发送请求时发生传输级错误。(提供程序:TCP 提供程序,错误:0 - 远程主机强制关闭了现有的连接。”
这可能是连接问题吗?或者我们在数据库服务器和 Web 服务器之间混淆了结果集?这让我非常困惑。
有问题的查询:
public static int GetActiveWebSiteID(string storeID, string statusID)
{
int retval;
string sql = @"SELECT isnull(MAX(PkID),0) FROM WebSite
WHERE StoreID = @StoreID
AND WebSiteStatusID = @WebSiteStatusID";
SqlConnection conn = new SqlConnection(Settings.ConnString);
SqlCommand cmd = new SqlCommand(sql, conn);
cmd.CommandType = CommandType.Text;
cmd.Parameters.AddWithValue("@StoreID", (object)storeID ?? DBNull.Value);
cmd.Parameters.AddWithValue("@WebSiteStatusID", (object)statusID ?? DBNull.Value);
conn.Open();
using(conn)
{
var scalar = cmd.ExecuteScalar(); // <-- This value returned here should only ever be an int, but randomly is a string
retval = Convert.ToInt32(scalar);
}
return retval;
}
上述查询在最近几年一直运行良好,但现在我们的应用程序中有一堆额外的LINQ查询(不确定是否有影响)。我们正在运行.Net 3.5。