SQl cmd.ExecuteReader() что он возвращает

#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 помощью ) или a List<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 , извините, это немного сбивает с толку все вместе