C# 为什么在foreach循环中正确尝试捕捉是一种好的做法?
为什么这个代码不起作用?当我把试捕器放在foreach时,效果很好。我需要知道原因。请帮忙C# 为什么在foreach循环中正确尝试捕捉是一种好的做法?,c#,C#,为什么这个代码不起作用?当我把试捕器放在foreach时,效果很好。我需要知道原因。请帮忙 try { mySqlConnection = new SqlConnection(); mySqlConnection.ConnectionString = System.Configuration.ConfigurationManager.AppSettings["connectionstring"].ToString(); mySqlCommand = new SqlCom
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处出错);}或者更好,在进入循环之前定义参数。在循环内部,仅更改其值(无需清除和重新生成参数集合)