2013-08-13 2 views
2

я следующее:Получение значения из SQL ExecuteScalar()

String sql = "SELECT * FROM Temp WHERE Temp.collection = '" + Program.collection + "'"; 
SqlConnection conn = new SqlConnection(connString); 
SqlCommand cmd = new SqlCommand(sql, conn); 
Program.defaultCollection = (String)cmd.ExecuteScalar(); 

И я хочу, чтобы получить второй столбец после выполнения оператора. Я знаю, что он вернет только один ряд с двумя столбцами.

Я читал в Интернете, что мне нужно будет прочитать каждую строку результата, есть ли другой способ?

+0

Итак, вы хотите только вторую колонку, или как первую, так и вторую? Если вам нужен только второй столбец, вы должны использовать явный список столбцов и сначала поставить нужный столбец. – JLRishe

+0

Я могу просто отфильтровать выделение, чтобы возвращать только этот столбец, а затем execclescalar, хорошая идея? – haysam

+0

Плохая практика - использовать 'SELECT *' в первую очередь. Вы должны использовать явные списки столбцов. – JLRishe

ответ

8

ExecuteScalar получает первый столбец из первой строки результирующего набора. Если вам нужен доступ более чем к вам, вам придется придерживаться другого подхода. Как это:

DataTable dt = new DataTable(); 
SqlDataAdapater sda = new SqlDataAdapter(sql, conn); 
sda.Fill(dt); 

Program.defaultCollection = dt.Rows[0]["defaultCollection"]; 

Теперь я понимаю, что имя поля не может быть defaultCollection, но вы можете заполнить, что в

От MSDN documentation для ExecuteScalar:.

Выполняет запрос, и возвращает первый столбец первой строки в результирующем наборе, возвращаемом запросом. Дополнительные столбцы или строки игнорируются.

Теперь, в качестве окончательного совета, оберните все объекты ADO.NET в операторе using. Например:

using (SqlConnection conn = new SqlConnection(connString)) 
using (SqlDataAdapter sda = new SqlDataAdapter(sql, conn)) 
{ 
    DataTable dt = new DataTable(); 
    sda.Fill(dt); 

    // do something with `dt` 
} 

это обеспечит их надлежащее расположение.

+1

делает совершенным смысл!! – haysam

2

И я хочу, чтобы получить второй столбец после выполнения оператора

Это не возможно с выполнить скаляр.

есть ли другой способ

У вас есть 2 варианта здесь либо использовать SqlDataAdapter или SqlDataReader. For you using DataReader is a recommended подход, как вам не нужны автономные данные или делать другие worh

с помощью SqlDataAdapter

using (SqlConnection c = new SqlConnection(
    youconnectionstring)) 
    { 
    c.Open(); 
    /
    using (SqlDataAdapter a = new SqlDataAdapter(sql, c)) 
    { 

     DataTable t = new DataTable(); 
     a.Fill(t); 
     if(t.Rows.Count > 0) 
     { 
      string text = t.Rows[0]["yourColumn"].ToString(); 
     }  
    } 
    } 

с помощью DataReader

using (SqlConnection connection = 
       new SqlConnection(connectionString)) 
    { 
     SqlCommand command = 
      new SqlCommand(sql, connection); 
     connection.Open(); 

     SqlDataReader reader = command.ExecuteReader(); 


     while (reader.Read()) 
     { 
      //read data here 
      string text = reader.GetString(1) 
     } 


     reader.Close(); 
    } 
0

Вы можете использовать DataReader и читать только первый столбец типа:

IDataReader cReader = cmd.ExecuteReader(); 

if(cReader.Read()) 
{ 
    string cText = cReader.GetString(1); // Second Column 
} 
1

SqlCommand.ExecuteScalar() может быть использован только , когда результат есть только один строку и один столбец.

Если вам нужно больше, чем один столбец должен быть возвращен, вы должны использовать что-то вроде этого:

String sql = "SELECT * FROM Temp WHERE Temp.collection = '" + Program.collection + "'"; 
SqlConnection conn = new SqlConnection(connString); 
using(SqlCommand cmd = new SqlCommand(sql, conn)) 
{ 
    using(SqlDataReader rdr = cmd.ExecuteReader()) 
    { 
     if(rdr.Read()) 
     { 
      Program.defaultCollection = (String)rdr["Column1"]; 
      Program.someOtherVar = (String)rdr["Column2"]; 
     } 
    } 
    rdr.Close(); 
} 

Это будет самый быстрый способ.

+0

Как утверждали другие, ExecuteScalar может использоваться против запросов, которые возвращают более одного столбца и более одной строки или возвращают null. В некоторых случаях это может быть нецелесообразно использовать, поскольку базовый запрос может иметь несколько объединений и полей и различные условия, которые могут привести к более вовлеченному плану запроса. Он лучше подходит для подсчетов или идентификаторов. Я использовал его для предварительной загрузки данных, т. Е. Выполнил скаляр на один запрос, а затем запросил данные через ExecuteReader позже, когда я думаю, что пользователь нуждается в нем, чтобы он выглядел быстрее (со смешанными результатами). –

0

ExecuteScalar возвращает только одно значение. Вы должны убедиться, что ваш запрос возвращает только это значение.

String sql = "SELECT temp.defaultCollection FROM Temp WHERE Temp.collection = '" + Program.collection + "'"; 

На боковой ноте, читайте на SqlParameter. Вы не хотите конкатенировать такие значения, у вас возникнет проблема, когда свойство коллекции содержит цитату.

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