为什么在foreach循环中尝试捕获是一个好习惯?

时间:2013-08-05 13:57:57

标签: c#

为什么这段代码不起作用?当我把try catch放在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)
{                
}

2 个答案:

答案 0 :(得分:8)

它不起作用,它运行一次,然后它很麻烦,但你正在捕捉Exception但却没有做任何事情。您的代码的问题是您正在添加重复的参数。你应该在每次循环后清除它们:

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();          
}

答案 1 :(得分:0)

最有可能的是,您在循环的第一次迭代中遇到错误。

因为你的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();  
        }
    }
}

我已经重构了你的代码以使用块,这样就不需要在连接对象上调用Close,并且在代码执行退出using块时也会正确处理它。

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