【发布时间】:2016-05-26 17:53:42
【问题描述】:
当我在 Visual Studio 2013 中选择“分析”>“对解决方案运行代码分析”时,我得到,“CA2202 不要多次处理对象对象 'fs' 可以在方法 'RoboReporterSQL.SaveReportDataToDB(string , string)'。为避免生成 System.ObjectDisposedException,您不应在一个对象上多次调用 Dispose。"
指示的代码行是:
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 将被关闭两次
虽然我不能肯定地反驳这一点,但我会质疑它,因为我没有看到它在其他地方关闭。
毕竟不是在“使用”块中,怎么关闭呢?
问题是:我真的应该删除那行代码(“fs.Close();”)吗?
注意:Resharper 并没有对此一无所知 - 使用“fs.Close();”无论进出,它都不会引发任何警告标志。
【问题讨论】:
-
您将其关闭两次。您在关闭 BinaryReader 时将其关闭 - 它还会关闭底层流。你真的应该使用
-
这在 SO 上被讨论死了,只有你的声誉才能让这个问题保持活力......
-
我想知道在这种情况下错误的措辞是否刚刚结束。如果关闭
BinaryReader可能会导致FileStream被释放,那么访问已释放对象的Close方法可能会抛出ObjectDisposedException。
标签: c# filestream dispose objectdisposedexception