【问题标题】:SQl cmd.ExecuteReader() what does it returnSQl cmd.ExecuteReader() 它返回什么
【发布时间】:2017-02-27 18:18:12
【问题描述】:

我正在学习 ASP.NET。我想知道cmd.ExecuteReader() 的输出是否可以暂时存储到某个东西中,例如临时变量,以便以后重新使用或更改它。我经常使用临时变量来存储东西。

如何让dropboxgridview 都使用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();
    }
}

【问题讨论】:

  • 填充DataTable(例如,用SqlDataAdapter.Fill)或List<Employee>,其中Employee 是一个自定义类,它包含tblEmployees 中每个(相关)列的一个属性。您可以将其用作DataSource 用于GridViewDropDownList。因此使用适当的DataTextFieldDataValueField
  • 但是我这里没有使用SQLdataAdapter,是不是有一个可以包含数据库读取结果的通用对象?
  • 一般来说,你不应该使用 SqlDataReader,因为这是一种单向流到数据库的方式,它需要一个打开的连接并且一个接一个地返回一条记录。您应该将其加载到集合中以将其存储在内存中。
  • @TimSchmelter 如示例所示,这里的 SQLreader 读取整个数据库而不是一条记录,我想知道 ExecuteReader 存储其数据的类型,我知道这是1 次阅读操作

标签: c# asp.net sqlcommand executereader


【解决方案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 控件中配置列。

【讨论】:

  • 好的,我不得不习惯于数据库不是列表或基本类型(dword/int)的想法,它们的声明以类型开头,然后是赋值,尽管我可以也可以将数据库作为一个整体来完成,但它确实是您在 .net 中的第二个答案
【解决方案2】:

要回答您的问题,它会返回 SqlDataReader,如 Msdn documentation - SqlCommand.ExecuteReader Method () 中所述

您可以查看文档示例以更好地理解ExecuteReader()

你已经把它变成了一个 XY 问题,但是要将数据绑定到 GridView,你应该使用 DataTableSqlDataAdapter。一个通用的例子是:

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
    }
}

我暂时不会使用您的代码,以便您可以对这个示例进行实验。如果您需要进一步的帮助,请在更改代码后编辑您的原始帖子。

【讨论】:

  • 抱歉,如果我可以运行 cmd.executedatareader(),它确实提供了一个结果数据网格或下拉菜单可以使用这样的结果,所以它必须是某种通用类型(我知道还有其他读取数据库的方法),但我的兴趣是 ExecuteDataReader
  • 这正是我告诉你你可以查看文档的原因。有一个示例,您可以调查并相应地更改您的代码。
  • SQLdatareader 是一个对象,而不是一个值类型,比如整数 int dword 等。我可以编码的是System.Data.DataTable tb = new System.Data.DataTable(); tb.Load(cmd.ExecuteReader)
  • 可能最后一行是答案,datareader 返回一个数据表,对不起,这有点混乱