#c# #asp.net #sqlcommand #executereader
#c# #asp.net #sqlcommand #executereader
Вопрос:
Я изучаю ASP.NET . Я задавался cmd.ExecuteReader()
вопросом, можно ли временно сохранить вывод во что-то, например, во временную переменную, чтобы позже повторно использовать его или изменить. Я часто использую временные переменные для хранения данных.
Как я могу позволить a dropbox
и a gridview
работать с результатом cmd.exectuteReader
. Я не хочу создавать для него новое SQL-соединение.
Переменная t
может сохранять содержимое, но, очевидно, я здесь ошибаюсь, поскольку она не работает. Он дважды запускает программу чтения, и при втором запуске нет данных для заполнения выпадающего списка.
Как мне это сделать?
protected void Page_Load(object sender, EventArgs e)
{
string cs = System.Configuration.ConfigurationManager.ConnectionStrings["DBCS"].ConnectionString; // reading by name DBCS out of the web.config file
using (SqlConnection con = new SqlConnection(cs))
{
SqlCommand cmd = new SqlCommand("Select * from tblEmployees", con);
con.Open();
var t = cmd.ExecuteReader();
GridView1.DataSource = t;// cmd.ExecuteReader();
GridView1.DataBind();
// DropDownList2.DataSource = cmd.ExecuteReader();
DropDownList2.DataSource = t;//cmd.ExecuteReader();
DropDownList2.DataTextField = "Name";
DropDownList2.DataValueField = "EmployeeId";
DropDownList2.DataBind();
}
}
Комментарии:
1. Заполните a
DataTable
(например, сSqlDataAdapter.Fill
помощью ) или aList<Employee>
, гдеEmployee
это пользовательский класс, который содержит одно свойство для каждого (соответствующего) столбца.tblEmployees
Вы можете использовать его какDataSource
дляGridView
иDropDownList
. Поэтому используйте соответствующиеDataTextField
иDataValueField
2. но я здесь не использую SqlDataAdapter, разве нет общего объекта, который может содержать результат чтения базы данных?
3. В общем случае вам не следует использовать SqlDataReader, потому что это односторонний поток в базу данных, который требует открытого соединения и возвращает одну запись за другой. Вы должны загрузить его в коллекцию, чтобы сохранить его в памяти.
4. @TimSchmelter как показано в примере, SQLreader здесь считывает всю базу данных, а не одну запись, я хотел бы знать, в каком типе ExecuteReader хранит свои данные, я знаю, что это действие чтения 1 раз
Ответ №1:
SqlDataReader — это прямой поток строк из базы данных SQL Server.
Вы можете привязать SqlDataReader к GridView следующими способами:
Простые примеры:
connection.Open();
command.Connection = connection;
SqlDataReader reader = command.ExecuteReader();
GridView1.DataSource = reader;
GridView1.DataBind();
Или:
DataTable dt = new DataTable();
dt.Load(cmd.ExecuteReader());
GridView1.DataSource = dt;
Не забудьте настроить столбцы внутри элемента управления Gridview.
Комментарии:
1. хорошо, мне пришлось немного привыкнуть к идее, что база данных не является списком или базовым типом (dword / int), их объявление начинается с типа, а затем присваивания значения, я хотя это можно было бы сделать и с базой данных в целом, но это действительно ваш второй ответ накак обстоят дела в .net
Ответ №2:
Чтобы ответить на ваш вопрос, он возвращает SqlDataReader
, как указано в документации Msdn — SqlCommand .Метод ExecuteReader ()
Вы можете проверить пример документации для лучшего понимания ExecuteReader()
Вы вроде как превратили это в проблему XY, но для привязки данных к a GridView
вы должны использовать a DataTable
и a SqlDataAdapter
. Общим примером может быть:
void FillData()
{
// 1
// Open connection
using (SqlConnection c = new SqlConnection(
Properties.Settings.Default.DataConnectionString))
{
c.Open();
// 2
// Create new DataAdapter
using (SqlDataAdapter a = new SqlDataAdapter(
"SELECT * FROM EmployeeIDs", c))
{
// 3
// Use DataAdapter to fill DataTable
DataTable t = new DataTable();
a.Fill(t);
// 4
// Render data onto the screen
// dataGridView1.DataSource = t; // <-- From your designer
}
}
Я пока не буду использовать ваш код, чтобы вы могли поэкспериментировать с этим примером. Если вам нужна дополнительная помощь, пожалуйста, отредактируйте исходное сообщение после изменения вашего кода.
Комментарии:
1. извините, но, если я могу запустить cmd.executedatareader() , он действительно выдает результат datagrids или pulldowns могут использовать такие результаты, поэтому он должен быть какого-то общего типа (я знаю, что есть другие способы чтения баз данных), но меня здесь интересует ExecuteDataReader
2. И именно поэтому я сказал вам, что вы можете проверить документацию. Существует пример, который вы можете изучить и соответствующим образом изменить свой код.
3. SqlDataReader — это объект, а не тип значения, такой как integer int dword и т. Д. Что я могу закодировать, так это
System.Data.DataTable tb = new System.Data.DataTable(); tb.Load(cmd.ExecuteReader)
4. вероятно, последняя строка является ответом, datareader возвращает datatable , извините, это немного сбивает с толку все вместе