2013-08-05 3 views
-8

Почему этот код не работает? Где, когда, когда я помещал try catch в foreach, он работает нормально. Мне нужно знать причину. Пожалуйста помоги.Почему это хорошая практика, чтобы попытаться поймать петлю 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) 
{     
} 
+7

Определить «не работает»? –

+3

НИКОГДА НЕ ПОПРОБУЙТЕ ПОГРУЖЕНИЕ БЕЗ ОБРАБОТКИ ИСКЛЮЧЕНИЯ НИКОГДА НИКОГДА НИКОГДА написать исключение для журнала. и проверьте, что случилось – Nahum

+1

Предполагаю, что у вас есть исключение. Поместите точку останова в блок * catch *. Или даже лучше - обработать это исключение (журнал, показать пользователю и т. Д.) –

ответ

8

Это не работает, он работает один раз, то это failling но вы ловли 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

Или лучше, определите параметры перед входом в цикл. Внутри цикла изменяются только их значения (нет необходимости очищать и перестраивать набор параметров) – Steve

+0

вы можете уточнить? –

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 на объект соединения и также будет правильно утилизировать его, когда выполнение кода выходит из блока использования.

Я также очистил коллекцию параметров перед добавлением новых, переместил некоторые средства определения свойств ближе к экземпляру объекта (поскольку они не полагаются ни на что другое) и переместил вызов SqlConnection.Open() за пределы цикла foreach, так как это будет экономить на ресурсах и времени выполнения. Это также поможет не погрузить SQL Server с подключениями, что может сильно повлиять на производительность.

Смежные вопросы