#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.