2015-02-27 5 views
1

Я хочу сохранить значения SqlCommand в строковой переменной и напечатать их на ярлыке. Вот мой код C#Как получить определенное значение от SqlCommand

String sq="select fullname,emailId from Registration where RgId= '"+Session["RgId"]+"'"; 

SqlCommand cmd1 = new SqlCommand(sq, con); 
con.Open(); 

SqlDataReader rdr = null; 
rdr = cmd1.ExecuteReader(); 

while(rdr.Read()) 
{ 
    string fname = (string)rdr["fullname"]; 
    string femail=(string)rdr["emailId"]; 
    Label4.Text = fname; 
    label5.Text=femail; 
} 

if(rdr!= null) 
{ 
    rdr.Close(); 
} 

con.Close(); 

, но вместо значения печати он не отображает значение на этикетке. Что делать? Что-то не так в коде?

+0

Проверьте переменный сеанс - если было сброшено, то она будет просить записи где RgId пуст. – lucrativelucas

+6

[Маленькие Bobby Tables ждут вас] (http://xkcd.com/327/) :-) – dasblinkenlight

+0

, по крайней мере, для защиты от атак инъекций: '((int) Session [" RgId "]) .ToString() ' – Hogan

ответ

0

Я бы рекомендовал использовать using заявления при рассмотрении доступа к БД. Вещи убираются лучше таким образом. Так как вы не используете TRY/поймать в коде при условии я предполагаю, вы используете его в наружном слое или что-то, так что я бы:

 if (Session["RgId"] == null) 
      throw new NullReferenceException("RgId"); 

     using (var con = new SqlConnection()) 
     { 
      const string sql = "select fullname,emailId from Registration where RgId = @RgId"; 

      using (var cmd1 = new SqlCommand(sql, con)) 
      { 
       cmd1.Parameters.Add(new SqlParameter("RdId", SqlDbType.Int) {Value = Session["RgId"]}); 
       con.Open(); 
       using (var rdr = cmd1.ExecuteReader(CommandBehavior.CloseConnection)) 
       { 
        if (rdr.Read()) 
        { 
         Label4.Text = (string) rdr["fullname"]; 
         label5.Text = (string) rdr["emailId"]; 
        } 
        else 
        { 
         //handle registration not found 
        } 
        rdr.Close(); 
       } 
      } 
     } 
0

Для выполнения SQL-запросов, а не для конкатенации строки, это очень опасно для вашей системы, облегчающей SQL-инъекции.

Подтвердите свои значения, прежде чем пытаться выполнить запрос и подтвердить возврат запроса.

if (Session["RgId"] != null && !String.IsNullOrEmpty(Session["RgId"].ToString())) 
{ 
    String sq = "select fullname,emailId from Registration where RgId = @RgId"; 

    SqlCommand cmd1 = new SqlCommand(sq, con); 
    cmd1.Parameters.Add("@RgId", Convert.ToInt32(Session["RgId"].ToString())); 

    con.Open(); 

    SqlDataReader rdr = cmd1.ExecuteReader(); 

    if (rdr != null) 
    { 
     while (rdr.Read()) 
     { 
      if (rdr["fullname"] != DBNull.Value && rdr["emailId"] != DBNull.Value) 
      { 
       Label4.Text = rdr["fullname"].ToString(); 
       label5.Text = rdr["emailId"].ToString(); 
      } 
     } 
    } 

    if (rdr != null) 
    { 
     rdr.Close(); 
    } 

    con.Close(); 
} 

С уважением,

Эндрю

+0

'ExecuteReader()' всегда возвращает 'IDataReader', поэтому проверка нулевого значения всегда будет ложной. – mxmissile

+0

Также см. Комментарий Крейга выше об использовании 'while'. – mxmissile

+0

использование если (dr.HasRows) –

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