-7

为什么这段代码不起作用?当我将 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)
{                
}
4

2 回答 2

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();          
}
于 2013-08-05T14:00:34.817 回答
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();  
        }
    }
}

我已将您的代码重构为使用 using 块,这消除了调用Close连接对象的需要,并且在代码执行退出 using 块时也会正确处理它。

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

于 2013-08-05T14:07:13.267 回答