我有一個查詢,應該總是返回一個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