首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Visual代码分析警告-多重处理[CA2202]

Visual代码分析警告-多重处理[CA2202]
EN

Stack Overflow用户
提问于 2015-03-20 13:25:39
回答 1查看 507关注 0票数 0
代码语言:javascript
复制
CA2202  Do not dispose objects multiple times   Object 'con' can be disposed more than once in method 'CreateHandheldDataViewModel.CreateSDF2(int, string)'. To avoid generating a System.ObjectDisposedException you should not call Dispose more than one time on an object.: Lines: 647  DFStore.Modules.Store   CreateHandheldDataViewModel.cs  647

我使用dispose得到了这个错误

代码语言:javascript
复制
 private void CreateSDF2(int depoId, string fileName)
            {
                string cnnStr = String.Format("Data Source = {0}", fileName);

                var sqlEngine = new SqlCeEngine(cnnStr);
                sqlEngine.CreateDatabase();
                sqlEngine.Dispose();

                var con = new SqlCeConnection(cnnStr);
                var command = new SqlCeCommand { Connection = con };
                String[] createDbScripts = GetCreateDBScript2().Split(new[] { " go " }, StringSplitOptions.RemoveEmptyEntries);

                if (con.State != ConnectionState.Open)
                    con.Open();
                foreach (String s in createDbScripts)
                {
                    command.CommandText = s;
                    command.ExecuteNonQuery();
                }
                if (con.State != ConnectionState.Closed)
                    con.Close();

                con.Dispose();

                InsertDatatoDB2(depoId, fileName);
            }
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2015-03-20 13:31:34

SqlConnection.Close()在功能上与SqlConnection.Dispose()相同。

因此,如果状态尚未关闭,这些代码行将两次释放连接:

代码语言:javascript
复制
if (con.State != ConnectionState.Closed)
    con.Close();
con.Dispose();

你只需要Dispose()

澄清一下,SqlConnection.Dispose()的实现是:

代码语言:javascript
复制
public void Dispose()
{
    this.Dispose(true);
    GC.SuppressFinalize(this);
}

protected override void Dispose(bool disposing)
{
    if (disposing)
    {
        this._userConnectionOptions = null;
        this._poolGroup = null;
        this.Close(); // <---------- It calls Close()
    }                 
    this.DisposeMe(disposing);
    base.Dispose(disposing);
}

CodeAnalysis似乎知道这一点,并且正在发出警告。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/29167610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档