この質問に重複して記載する前に、わかりにくい難しい部分をここに示します。このエラーは散発的ですが、コードは正しいと思っていますし、いつも動作していて、リーダー部分のif else条件で起こりうるミスを処理しています。ここでは、コードは次のとおりです。コードが同期されていませんthrowingインデックスが範囲外でしたか?
public static Tuple<int, string> GetIDAndString(string term)
{
try
{
using (SqlConnection con = GetConnection())
using (cmd = new SqlCommand())
using (myReader)
{
int ID = 0;
string status = string.Empty;
cmd.Connection = con;
con.Open();
cmd.CommandText = @"SELECT t.TableID, t.Status
FROM Table t WITH (NOLOCK) /* I know NOLOCK is not causing the mistake as far as I know */
WHERE t.Term = @term";
cmd.Parameters.AddWithValue("@term", term);
myReader = cmd.ExecuteReader();
while(myReader.Read())
{
ID = myReader.IsDBNull(0) ? 0 : myReader.GetInt32(0);
status = myReader.IsDBNull(1) ? string.Empty : myReader.GetString(1).Trim();
}
myReader.Close();
return new Tuple<int, string>(ID, status);
}
}
catch (Exception)
{
throw;
}
}
私はタプルの代わりにクラスを使用する必要があります知っているが、私は、既存のコードを変更し、あなたが見ることができるようにすることはできません。したがって、主な問題は、プロダクションサーバーにはその方法にIndex out of bounds array exception
があったが、問題の原因を特定できないということです。
クエリにキーワードが見つからない場合でも、myReaderは入力されず、ID = 0、status = string.Emptyが返されます。コードをデバッグして、develpment server
で作業しているときに、コードがどこからでもクラッシュするようになり、テストされたコードがどこにあるのかの例外が表示され、その解決策を再開する必要があります溶液を洗浄する)。
だから、私は誰かがそのようなことを経験していることを、production server
で願っています。私はプロダクションサーバの仕様を持っていないので、サーバについて何も知らない。
新しいデータリーダーを作成して共有しないでください!これはあなたに問題をもたらす可能性があります! – mybirthname
前のコメントに同意するか、新しいインスタンスを作成するか、または新しいインスタンスを作成するか、そのインスタンスへのアクセスを同期します。 –
@mybirthname、私はプログラミングが初めてです。あなたはdataReaderを共有しないと言っています。あなたは、保護された静的なSqlDataReaderを宣言したクラスを使用せずに、それをusingブロックで使用することを意味しますか? –