私は常には単一のintを返すべきクエリを持っています。私は今、それがなければならないものとは全く関係のない文字列を返すようにログに記録しました。intでなければならないSqlCommandが文字列を返すのはなぜですか?
いくつかのデータベースクエリまで追跡したいくつかのランダムなFormatExceptionsがあります。追加のロギングの後、私は、今朝、以下のクエリで文字列 "gladiator"が返されたことがわかりました。 Website.PkIDはint型のカラムで、ほとんどの場合動作しますが、失敗すると失敗し、そこからwaaaay(有効なWebsiteIDより大きい)またはランダムな文字列を返します。
この特定のクエリは、セッション開始ごとに1回ヒットします。共有接続を使用していないため、このような混乱した結果をどうやって得ることができるか理解できません。接続プールに何らかの破損がありますか?
私は問題がこのクエリに分離されているとは思わない。私は同様のFormatExceptions(予期しない結果のため)LINQクエリから来て同様に見てきました。同じ時間にこれらのエラーのいくつかを検出しました:
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.
接続に問題がありますか?あるいは、dbサーバーと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を実行しています。
文字列のときの 'スカラー'の値は? –
"0" MAX(PkID)がnullのとき文字列である可能性があります – TheVillageIdiot
前述のように、私が見た文字列は "剣闘士"でした。私は、これは何らかの形で、システムのどこかからの他のクエリ結果、具体的にはキーワード検索と混乱しています。しかし、私はまだそれを証明することはできません。 –