我有一个查询,应该总是返回一个int。我现在记录它返回一个完全无关的字符串。为什么我的SqlCommand应该是一个int时返回一个字符串?
我们已经得到了一些随机的FormatExceptions,我们已经追踪了几个数据库查询。经过一些额外的日志记录后,我发现,今天上午,下面的查询返回了字符串“角斗士”。 Website.PkID是一个int列,大多数情况下都是可用的,但有时它会惨败,并返回一个int值(比任何有效的WebsiteID大)或一个随机字符串。
此特定查询在每个会话开始时被击中一次。它没有使用共享连接,所以我无法理解如何得到这样的混合结果。连接池中是否存在某种腐败?
我不认为问题是孤立于此查询。我也看到了来自LINQ查询的类似的FormatExceptions(因为意外的结果)。我们也在同一时间发现了一些这些错误:
A transport-level error has occurred when sending the request to the server. (provider: TCP Provider, error: 0 - An existing connection was forcibly closed by the remote host.
它可能是连接问题吗?或者,也许我们正在将数据库服务器和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。
'标量'的值是什么字符串? – 2009-05-19 13:43:50
可能是字符串,当它为“0”时MAX(PkID)为空 – TheVillageIdiot 2009-05-19 13:45:36
如前所述,我看到登录错误的字符串是“角斗士”。我有一种预感,它与来自系统某处的其他查询结果有某种混淆,特别是关键字搜索。但我还不能证明这一点。 – 2009-05-19 15:14:53