2013-08-05 1 views
0

У меня есть таблица в БД с 3 столбцами и у меня есть запрос на выборку, как это:как получить SELECT * FROM Таблица результатов в более чем одной переменной в C#

cmd.CommandText = ("SELECT * FROM Game WHERE gameID = " + game_id); 

эта таблица имеет: gameID, Player1, Player2. моя цель - получить имена игроков (Player1, Player2) из таблицы в 2 переменные в C#, поэтому я могу использовать их для отображения в форме. Я попытался использовать cmd.executeScalar(), но мне достается только один результат, а не 2.

как я могу это сделать?

+0

Ну какой код вы используете? Вы показали нам запрос. Отлично. Это начало. Что еще? Какой код вы используете для фактического выполнения этого в базе данных и чтения его результата? Только этого недостаточно. – Arran

+0

это был мой вопрос. как я могу прочитать результаты в 2 переменных. –

ответ

7

Во-первых, несколько важных рекомендаций:

  • Не используйте SELECT *. Вы можете вернуться к чему-то другому, чем вы думали (например, если схема базы данных была изменена тем временем). Вместо этого укажите каждый столбец, который вас интересует явно.

  • Вместо склеивания SQL-запроса с использованием конкатенации строк используйте запрос @parameterized. Это хороший принцип, который следует из соображений производительности (кэширование запросов) и безопасности (предотвращение атак SQL injection).

Так что ваш код становится:

cmd.CommandText = "SELECT Player1, Player2 FROM Game WHERE gameID = @gameId"; 
cmd.Parameters.AddWithValue("@gameId", game_id); 

Теперь на Ваш вопрос: Как получить значения Player1 и Player2 каждой записи? То есть, где IDataReader s приходят в Считыватель данных является однонаправленный курсор над результирующей таблицы, что позволяет получить доступ к значениям каждого возвращенного запись:.

// SqlConnection connection = cmd.Connection; 
connection.Open(); 
using (var reader = cmd.ExecuteReader(CommandBehavior.CloseConnection)) 
{ 
    int player1Index = reader.GetOrdinal("Player1"); 
    int player2Index = reader.GetOrdinal("Player2"); 
    while (reader.Read()) // one loop iteration per record returned from SELECT 
    { 
     string player1 = cmd.GetString(player1Index); 
     string player2 = cmd.GetString(player2Index); 
     … // do something with player1, and player2 
    }   
} 
+0

+1 для рекомендаций. – christiandev

0

Использование cmd.ExecuteReader(); вместо executeScalar

1

Использование ExecuteReader(); вот example. Кроме того, посмотрите на мою question здесь о том, как читать из читателя

1

согласно ExecuteScalar documentation:

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

Вместо этого вам придется использовать ExecuteReader. Также ваш код уязвим для SQL-инъекции.

+0

Почему он уязвим для SQL-инъекций? –

+0

@ShimritRevivo: Отметьте [эту запись] (http://en.wikipedia.org/wiki/SQL_injection#Technical_implementation) в Википедии –

1

Рассмотрим используя что-то вроде этого:

using (SqlConnection cnn = new SqlConnection(cnnString)) 
{ 
    cnn.Open(); 
    using (SqlCommand cmd = new SqlCommand("SELECT * FROM Game WHERE gameID = @gameID", cnn)) 
    { 
     cmd.Parameters.AddWithValue("@gameID", game_id); 
     using (SqlDataReader rdr = cmd.ExecuteReader()) 
     { 
      var player1 = rdr.GetString(1); 
      var player2 = rdr.GetString(2); 
     } 
    } 
} 

используя блок, как это вы получите три вещи:

  1. Доступ к полям, которые вы хотите.
  2. Защита от SQL-инъекций.
  3. Правильное удаление неуправляемых ресурсов при подключении к базе данных.