2015-02-10 9 views
0

Я пытаюсь получить результат от выбора команды:Получение результата от Select Command SQL Server

string strName = dtTable.Rows[i][myName].ToString(); 
string selectBrand = "SELECT [brand] FROM [myTable] WHERE [myName] = '" + strName + "'"; 

SqlCommand sqlCmdSelectBrand = new SqlCommand(selectBrand , sqlConn); 
sqlCmdSelectBrand .Connection.Open(); 
sqlCmdSelectBrand .ExecuteNonQuery();       

string newBrand = Convert.ToString(sqlCmdSelectBrand .ExecuteScalar());       
sqlCmdSelectBrand .Connection.Close(); 

Выбрать, работает, я выполнил его в SQL Studio, но не присваивает моей переменной на вторая - последняя строка. Ничто не привязано к этой переменной, когда я ее отлаживаю ...

Любой совет?

+0

Примечание: Есть ли причина, по которой вы вызываете 'sqlCmdSelectBrand.ExecuteNonQuery()'? Это не обязательно должно быть основано на способе написания кода. – entropic

+0

Я действительно удалил его пару минут назад, я больше не использую его – codeFinatic

ответ

1

Ваш подход к чтению данных, возвращенных из запроса SELECT, является (в данном конкретном контексте) немного неправильным. Обычно вы вызываете ExecuteReader экземпляра SqlCommand, чтобы вернуть свои данные.

string strName = dtTable.Rows[i][myName].ToString(); 
string selectBrand = "SELECT [brand] FROM [myTable] WHERE [myName] = @name"; 

using(SqlCommand sqlCmdSelectBrand = new SqlCommand(selectBrand , sqlConn)) 
{ 
    sqlCmdSelectBrand.Parameters.Add(
      new SqlParameter("@name", SqlDbType.NVarChar)).Value = strName; 
    sqlCmdSelectBrand .Connection.Open(); 
    using(SqlDataReader reader = sqlCmdSelectBrand.ExecuteReader()) 
    { 
     if(reader.HasRows) 
     { 
      reader.Read(); 
      string newBrand = reader.GetString(reader.GetOrdinal("Brand")); 
      ..... work with the string newBrand.... 
     } 
     else 
      // Message for data not found... 

     sqlCmdSelectBrand .Connection.Close(); 
    } 
} 

В вашем контексте призыв к ExecuteNonQuery не требуется, поскольку он не возвращает ничего из отобранного запроса. Вызов ExecuteScalar должен работать, если у вас есть хотя бы одна запись, соответствующая условию WHERE.

Обратите внимание, что при создании текста команды sql следует всегда использовать параметризованный запрос. Также, если вы считаете, что полный контроль над входами, конкатенация строки является открытой дверью Sql Injection

+0

Этот ответ должен быть добавлен в FAQ. –

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