Как использовать результат sql-запроса в переменной?

#c# #sql-server

#c# #sql-сервер

Вопрос:

Я хотел бы одновременно использовать результат моего sql-запроса в переменной.Как я могу сделать?

 var conn = new SqlConnection(@"Server=(localdb)MSSQLLocalDB; AttachDbFileName=|DataDirectory|database.mdf;");
conn.Open();
var comm = new SqlCommand($"SELECT name FROM database WHERE age = 25", conn);
var reader = comm.ExecuteReader();
 while(reader.Read())
{
  string name =reader[0].ToString();

}
conn.Close();


if (name != textbox.Text)
{
 //do something
}
  

Комментарии:

1. Это не будет единичным результатом. Если только что-то не совсем странное, в вашей базе данных должно быть более одного пользователя в возрасте 25 лет. Соответственно, вам нужно сопоставить результат запроса с массивом или списком. Если вы действительно ожидаете только одно значение (которое должно происходить только со скалярными функциями или вы используете что-то вроде первичного ключа / другого уникального), то ExecuteScalar — это правильный путь.

2. Просто несколько общих замечаний на потом: 1. Если вы планируете разрешить пользователю выбирать значения, вы действительно хотите использовать параметризованные запросы. Нет смысла быть закадровой частью в этом комиксе: xkcd.com/327 2. Вы хотите закрыть соединение более надежным способом. использование блока — самый надежный способ. 3. Обычно вы не храните «обработанные данные» в базе данных. Вы сохраняете день рождения и вычисляете возраст. Конечно, по практическим соображениям вы все равно можете каким-то образом кэшировать результат, если вы действительно уверены, что не сохраняете старое значение.

Ответ №1:

Используйте DataTable , и вы сможете легко получить доступ к своим данным rows. Что-то вроде:

 DataTable dt = new DataTable();
dt.Load(reader)
  

Затем вы можете использовать DataTable.Rows свойство.

 DataRow row = dt.Rows[0];
string name = row["name"].ToString();
  

Ответ №2:

вместо этого вы могли бы использовать DataAdapter :

 var table = new DataTable(); 

using(SqlConnection con = new SqlConnection(@"Server=(localdb)MSSQLLocalDB; AttachDbFileName=|DataDirectory|database.mdf;"))
using(SqlCommand command =  new SqlCommand($"SELECT name FROM database WHERE age = 25", con))
using(SqlDataAdapter adapter = new SqlDataAdapter(command))
{
    con.Open();
    adapter.Fill(table);
}


// if single row 
if (table.Rows[0].Field<string>("name") != textbox.Text)
{
 //do something
}

//if multiple rows 
for(int x = 0; x < table.Rows.Count; x  )
{
    if (table.Rows[x].Field<string>("name") !=  textbox.Text)
    {
     //do something
    }
}
  

Комментарии:

1. Нет необходимости открывать соединение перед адаптером данных. Fill(). DataAdapter откроет и закроет соединение для вас; однако, если он обнаружит, что оно открыто, он оставит его открытым. Здесь нет проблем, поскольку вы используете блоки using.