为什么这段代码不起作用?当我把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)
{
}
答案 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,这会严重影响性能。