2015-11-12 4 views
1

Это код, который у меня есть. Он отлично работает, но возвращает только одну строку. Как вы можете видеть в SQL-заявлении мне нужно 2 строки, возвращаемые в datagrid, которые я использую в форме. Хотя процедура читает 2 строки, она отображает только одну строку. NameAddrmark - это конструктор для полей.Как получить несколько строк от Datareader

public NameAddrmark GetNameRespCommentData(string respid) 
    { 
     NameAddrmark cms = new NameAddrmark(); 
     //var cms = new List<NameAddrmark>(); 

     SqlConnection connection = new SqlConnection(GeneralData.getConnectionString()); 

     string sql = "SELECT top 2 * FROM dbo.RESPONDENT_COMMENT WHERE respid = " + GeneralData.AddSqlQuotes(respid) + " and USRNME = " + GeneralData.AddSqlQuotes(UserInfo.UserName) + " order by COMMDATE ASC"; 
     SqlCommand command = new SqlCommand(sql, connection); 

     try 
     { 
      connection.Open(); 
      SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult); 

      while(reader.Read()) 
      //if (reader.Read()) 
      { 
       cms.Id = respid; 
       cms.Date8 = reader["COMMDATE"].ToString(); 
       cms.Usrnme = reader["USRNME"].ToString(); 
       cms.Marktext = reader["COMMTEXT"].ToString(); 
      } 
      //else 
      // cms = null; 
     } 
     catch (SqlException ex) 
     { 
      throw ex; 
     } 
     finally 
     { 
      connection.Close(); 
     } 
     return cms; 
    } 

В моей форме я возвращаю cms в список. Задайте источник данных в списке данных. Правильно отображает первую строку, но мне нужно отобразить две строки. Надеюсь, кто-то может помочь. Благодарю.

+2

Вы просто устанавливаете поля cms каждый раз, почему бы это добавить информацию? – Egor

+0

[SQL Injection alert] (http://msdn.microsoft.com/en-us/library/ms161953%28v=sql.105%29.aspx) - вы должны ** не ** объединять свои SQL-запросы - использовать ** параметризованные запросы ** вместо того, чтобы избежать SQL-инъекции –

+0

Спасибо, изменил его на параметризованный запрос. – TonyM

ответ

6

Вы можете вернуть List<NameAddrmark>:

public List<NameAddrmark> GetNameRespCommentData(string respid) 
{ 
    List<NameAddrmark> cmsList = new List<NameAddrmark>(); 

    SqlConnection connection = new SqlConnection(""); 

    string sql = "SELECT top 2 * FROM dbo.RESPONDENT_COMMENT WHERE respid = " + GeneralData.AddSqlQuotes(respid) + " and USRNME = " + GeneralData.AddSqlQuotes(UserInfo.UserName) + " order by COMMDATE ASC"; 
    SqlCommand command = new SqlCommand(sql, connection); 

    try 
    { 
     connection.Open(); 
     SqlDataReader reader = command.ExecuteReader(CommandBehavior.SingleResult); 

     while (reader.Read()) 
     { 
      NameAddrmark cms = new NameAddrmark(); 
      cms.Id = respid; 
      cms.Date8 = reader["COMMDATE"].ToString(); 
      cms.Usrnme = reader["USRNME"].ToString(); 
      cms.Marktext = reader["COMMTEXT"].ToString(); 
      cmsList.Add(cms); 
     } 
    } catch (SqlException ex) 
    { 
     throw ex; 
    } finally 
    { 
     connection.Close(); 
    } 
    return cmsList; 
} 

Но вы действительно должны использовать параметры вместо конкатенации, чтобы предотвратить SQL инъекции.

+0

Извините за задержанный ответ. Решение Тима отлично работало. Благодарю. Ты «быстрый и фантастический» Тим. – TonyM

0
private void button2_Click(object sender, EventArgs e) 
     { 
      //database connection string and opening area 
      string oracleDb = @"Data Source="connection string here""; 
      OracleConnection conn = new OracleConnection(oracleDb); 
      conn.Open(); 

      //declareing paramater and readning parameter input 
      OracleParameter param = new OracleParameter(); 
      param.OracleDbType = OracleDbType.Decimal; 
      param.Value = txtlist.Text; 

      OracleCommand cmd = new OracleCommand(); 
      cmd.Connection = conn; 

      //sendting the parameter to the tabase query 
      cmd.Parameters.Add(param); 
      cmd.CommandText = "SELECT NAME, ADDRESS FROM FRIENDS WHERE age = :1"; 

      cmd.CommandType = CommandType.Text; 
      OracleDataReader dataread = cmd.ExecuteReader(); 
      dataread.Read(); 

      if (dataread.HasRows) 
      { 
       while (dataread.Read()) 
       { 
        listBox1.Items.Add(dataread.GetString(1) + " from " + dataread.GetString(2)); 
       } 
      } 
      else 
      { 
       listBox1.Text = "Not Found"; 
       MessageBox.Show("Data Not found", "NOT FOUND", MessageBoxButtons.OK, MessageBoxIcon.Information); 
      } 
      conn.Dispose(); 
     } 
+0

Этот ответ, похоже, не имеет большого отношения к вопросу. Возможно, вы разместили его на неправильной вкладке браузера? – waka

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