C# 为什么在foreach循环中正确尝试捕捉是一种好的做法?

C# 为什么在foreach循环中正确尝试捕捉是一种好的做法?,c#,C#,为什么这个代码不起作用?当我把试捕器放在foreach时,效果很好。我需要知道原因。请帮忙 try { mySqlConnection = new SqlConnection(); mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString(); mySqlCommand = new SqlCom

为什么这个代码不起作用?当我把试捕器放在foreach时,效果很好。我需要知道原因。请帮忙

try
{
    mySqlConnection = new SqlConnection();
    mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString();

    mySqlCommand = new SqlCommand("spSocialGetUniqueWords", mySqlConnection);

    foreach (KeyValuePair<string, int> pair in url)
    {
        mySqlCommand.Parameters.Add(
        new SqlParameter("@uniqueKeyWords", pair.Key));

        mySqlCommand.Parameters.Add(
        new SqlParameter("@counts", pair.Value));

        mySqlCommand.CommandType = CommandType.StoredProcedure;
        mySqlCommand.Connection.Open();
        count = mySqlCommand.ExecuteNonQuery();
        mySqlCommand.Connection.Close();          
    }                
}
catch (Exception ex)
{                
}
试试看
{
mySqlConnection=newsqlconnection();
mySqlConnection.ConnectionString=System.Configuration.ConfigurationManager.AppSettings[“ConnectionString”].ToString();
mySqlCommand=newsqlcommand(“spSocialGetUniqueWords”,mySqlConnection);
foreach(url中的KeyValuePair对)
{
mySqlCommand.Parameters.Add(
新的SqlParameter(“@uniqueKeyWords”,pair.Key));
mySqlCommand.Parameters.Add(
新的SqlParameter(“@counts”,pair.Value));
mySqlCommand.CommandType=CommandType.StoredProcess;
mySqlCommand.Connection.Open();
count=mySqlCommand.ExecuteNonQuery();
mySqlCommand.Connection.Close();
}                
}
捕获(例外情况除外)
{                
}

它不工作,只运行了一次,然后出现故障,但您捕获了异常,但没有对其执行任何操作。代码的问题是添加了重复的参数。应在每次循环后清除它们:

foreach (KeyValuePair<string, int> pair in url)
{
    mySqlCommand.Parameters.Clear();

    mySqlCommand.Parameters.Add(
    new SqlParameter("@uniqueKeyWords", pair.Key));

    mySqlCommand.Parameters.Add(
    new SqlParameter("@counts", pair.Value));

    mySqlCommand.CommandType = CommandType.StoredProcedure;
    mySqlCommand.Connection.Open();
    count = mySqlCommand.ExecuteNonQuery();
    mySqlCommand.Connection.Close();          
}
foreach(url中的KeyValuePair对)
{
mySqlCommand.Parameters.Clear();
mySqlCommand.Parameters.Add(
新的SqlParameter(“@uniqueKeyWords”,pair.Key));
mySqlCommand.Parameters.Add(
新的SqlParameter(“@counts”,pair.Value));
mySqlCommand.CommandType=CommandType.StoredProcess;
mySqlCommand.Connection.Open();
count=mySqlCommand.ExecuteNonQuery();
mySqlCommand.Connection.Close();
}

很可能在循环的第一次迭代中遇到错误

因为try/catch块在循环外部,所以整个循环停止执行,而如果将其放入循环内部,如果第一次迭代包含错误,而第二次迭代没有,代码仍然可以尝试并执行第二次迭代

但是,假设错误是您没有清除参数,则此代码可能会工作得更好:

using (mySqlConnection = new SqlConnection())
{
    mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString();

    using (mySqlCommand = new SqlCommand("spSocialGetUniqueWords", mySqlConnection))
    {
        mySqlCommand.CommandType = CommandType.StoredProcedure;

        mySqlConnection.Open();

        foreach (KeyValuePair<string, int> pair in url)
        {
            mySqlCommand.Parameters.Clear();

            mySqlCommand.Parameters.Add(
                new SqlParameter("@uniqueKeyWords", pair.Key));

            mySqlCommand.Parameters.Add(
                new SqlParameter("@counts", pair.Value));

            count = mySqlCommand.ExecuteNonQuery();  
        }
    }
}
使用(mySqlConnection=newsqlconnection())
{
mySqlConnection.ConnectionString=System.Configuration.ConfigurationManager.AppSettings[“ConnectionString”].ToString();
使用(mySqlCommand=newsqlcommand(“spSocialGetUniqueWords”,mySqlConnection))
{
mySqlCommand.CommandType=CommandType.StoredProcess;
mySqlConnection.Open();
foreach(url中的KeyValuePair对)
{
mySqlCommand.Parameters.Clear();
mySqlCommand.Parameters.Add(
新的SqlParameter(“@uniqueKeyWords”,pair.Key));
mySqlCommand.Parameters.Add(
新的SqlParameter(“@counts”,pair.Value));
count=mySqlCommand.ExecuteNonQuery();
}
}
}
我已经将您的代码重构为使用using块,这样就不需要对connection对象调用
Close
,并且在代码执行退出using块时也会正确地处理它


在添加新的参数集合之前,我还清除了参数集合,将一些属性设置器移到更靠近对象实例化的位置(因为它们不依赖任何其他内容),并将
SqlConnection.Open()
调用移到foreach循环之外,因为这将节省资源和执行时间。它还将有助于避免连接淹没SQL Server,这可能会严重影响性能。

定义“不工作”?切勿在不处理异常的情况下尝试捕获,切勿将异常写入日志。我想你有例外。在catch块中放置断点。或者更好-处理异常(日志、向用户显示等)错误-过程或函数SPSSocialGetUniqueWords指定的参数太多。我正在处理错误。。。catch(Exception ex){TraceService(“在populateData+DateTime.Now+“----+ex.Message处出错);}或者更好,在进入循环之前定义参数。在循环内部,仅更改其值(无需清除和重新生成参数集合)