2015-08-26 2 views
2

Я следующий код в C# -SQL DataReader чтение непоследовательно

private void sendnotificationmail(string enqid) 
{ 
    try 
    { 
     connection.Open(); 
     List<string> maillist = new List<string>(); 
     string sql = "SELECT  TrussLog.repmail, TrussLog.branchemail, TrussEnquiry.DesignerEmail FROM   TrussLog FULL OUTER JOIN      TrussEnquiry ON TrussLog.enquirynum = TrussEnquiry.Enquiry_ID   where TrussEnquiry.Enquiry_ID = '" + enqid + "'"; 
     SqlCommand cmd = new SqlCommand(sql); 
     SqlDataReader reader = cmd.ExecuteReader(); 

     while (reader.Read()) 
     { 
      if (!string.IsNullOrEmpty(reader[0].ToString())) 
      { 
       maillist.Add(reader[0].ToString()); 
      } 
      if (!string.IsNullOrEmpty(reader[1].ToString())) 
      { 
       maillist.Add(reader[1].ToString()); 
      } 
      if (!string.IsNullOrEmpty(reader[2].ToString())) 
      { 
       maillist.Add(reader[2].ToString()); 
      } 
     } 
     connection.Close(); 

     if (result != DialogResult.Cancel) 
     { 
      processmail(maillist); 
     } 
    } 
    catch (Exception) 
    { 
    } 
} 

Я получаю значение переменной enqid из выпадающего списка на моем содержание Окна form.The из выпадающего списка извлекается из базы данных. При загрузке формы combobox отображает первый идентификатор запроса, полученный из базы данных. Когда я запускаю свою программу, считыватель данных пропускает цикл. Однако, если выбрать другой запрос в выпадающем списке, чтение данных работает правильно

+0

Возможно, первое 'enquiryId' не дает никаких результатов. Вы используете текущий код, подверженный SQL Injection. Вместо этого используйте параметризованный запрос. –

+0

первый запрос ID извлекается из базы данных – betty

+0

Извлечен ли он с использованием того же запроса? –

ответ

2

Кажется, что вы забыли ассоциированныхCommand с Connection:

// SendNotificationMail is more readable then sendnotificationmail 
    private void sendnotificationmail(string enqid) { 
    // put IDisposable into using... 
    using (SqlConnection con = new SqlConnection("ConnectionStringHere")) { 
     con.Open(); 

     using (SqlCommand cmd = new SqlCommand()) { 
     cmd.Connection = con; // <- You've omitted this 

     // have SQL readable 
     cmd.CommandText = 
      @"SELECT TrussLog.repmail, 
        TrussLog.branchemail, 
        TrussEnquiry.DesignerEmail 
       FROM TrussLog FULL OUTER JOIN      
        TrussEnquiry ON TrussLog.enquirynum = TrussEnquiry.Enquiry_ID   
      WHERE TrussEnquiry.Enquiry_ID = @prm_Id"; 

     // use parametrized queries 
     cmd.Parameters.AddWithValue("@prm_Id", enqid); 

     using (SqlDataReader reader = cmd.ExecuteReader()) { 
      while (reader.Read()) { 
      ... 
      } 
     } 
     } 
    } 
    } 

И никогда, никогда после того, как код записи, так

catch (Exception) 
    { 
    } 

, что означает «просто игнорировать все ошибки и продолжить ".

+1

И улов проглотил ошибку. Почему люди думают, что подавление ошибок исправляет их ?! Никогда не понимал этого. – usr

+0

@DmitryBychenko Да, вы правы в том, что он не определяет соединение с командой. – Greg

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