Visual Studio 2013でソリューションのRUnコード分析を選択すると、「CA2202オブジェクトを複数回は処理しないでください。メソッド 'RoboReporterSQL.SaveReportDataToDB(string、string)」にオブジェクト' fs 'を複数回配置できます。 。。」あなたがオブジェクト上に複数の時間を設ける呼び出すべきではありませんSystem.ObjectDisposedExceptionの発生を回避するために「この表面的に無意味なコード解析の警告に耳を傾けるべきですか?
コードの指示された行は、次のとおりです。
fs.Close();
そして、ここでは、コンテキスト内のコードです:
internal static void SaveReportDataToDB(string filename, string
RESTFilename)
{
if (RecordAlreadyExists(RESTFilename)) return;
string EXCEL_FILE = "application/vnd.ms-excel";
DateTime begDate =
RoboReporterConstsAndUtils.GetBeginDate(RESTFilename);
DateTime endDate =
RoboReporterConstsAndUtils.GetEndDate(RESTFilename);
var fs = new FileStream(filename, FileMode.Open, FileAccess.Read);
BinaryReader br = new BinaryReader(fs);
Byte[] bytes = br.ReadBytes((Int32)fs.Length);
br.Close();
fs.Close();
using (var sqlConn = new SqlConnection(CPSConnStr))
{
var insertStr = "INSERT INTO ReportsGenerated (FileBaseName,
ContentType, BinaryData, BeginDate, EndDate) " +
"VALUES (@FileBaseName, @ContentType,
@BinaryData, @BeginDate, @EndDate)";
using (var insertRptsGenerated = new SqlCommand(insertStr))
{
insertRptsGenerated.Connection = sqlConn;
insertRptsGenerated.Parameters.Add("@FileBaseName",
SqlDbType.VarChar, 100).Value = RESTFilename;
insertRptsGenerated.Parameters.Add("@ContentType",
SqlDbType.VarChar, 50).Value = EXCEL_FILE;
insertRptsGenerated.Parameters.Add("@BinaryData",
SqlDbType.Binary).Value = bytes;
insertRptsGenerated.Parameters.Add("@BeginDate",
SqlDbType.DateTime).Value = begDate;
insertRptsGenerated.Parameters.Add("@EndDate",
SqlDbType.DateTime).Value = endDate;
sqlConn.Open();
insertRptsGenerated.ExecuteNonQuery();
}
}
}
"fs.Close();を呼び出すと、警告がFileStreamが2回クローズしていると主張しています。
私は確実にそれを否定していませんが、私はそれが他の場所に閉じ込められているとは思わないので、質問します。
結局のところ、それは "使用中"ブロックではないので、どのように閉じていますか?
質問:私は本当にそのコード行( "fs.Close();")を削除する必要がありますか?
注:Resharperはこのことについて、「fs.Close();」と言っていませんでした。それはどちらの方法でも警告フラグを立てません。
あなたはそれを2回閉じています。 BinaryReaderを閉じるときに閉じています - それはまた、下にあるストリームを閉じます。そして、あなたは本当に使用している必要があります –
これは死ぬために議論されており、あなたの評判だけが生きている質問を維持します... –
私はこのケースではエラーの言葉だけをオフになっているのだろうかと思います。 'BinaryReader'を閉じることで' FileStream'が破棄された場合、破棄されたオブジェクトの 'Close'メソッドにアクセスすると' ObjectDisposedException'がスローされることがあります。 –