【问题标题】:Can i bind same datareader object to 2 controls?我可以将相同的数据读取器对象绑定到 2 个控件吗?
【发布时间】:2012-09-01 13:14:30
【问题描述】:

我正在尝试将相同的数据读取器对象绑定到 2 个控件。一个是 gridview,第二个是 formview。gridview 正在绑定,但 formview 没有。即使我在绑定两个控件后关闭对象。 谁能告诉我这是否可能。如果是,那么如何?

这是我的代码:-

   SqlConnection con = new SqlConnection(getconnectionstring());
   SqlCommand cmd = new SqlCommand();
    SqlCommand cmd1 = new SqlCommand();

   //cmd.CommandText = "SELECT firstname,lastname FROM crudtable";  
    cmd.CommandText = "SELECT firstname,lastname FROM crudtable";
    cmd1.CommandText = "SELECT firstname FROM crudtable";

    cmd.Connection = con;
    cmd1.Connection = con;

    con.Open();

    SqlDataReader reader ;
    SqlDataReader reader1;

    reader = cmd.ExecuteReader();
    GridView1.DataSource = reader;
    GridView1.DataBind();

    FormView1.DataSource = reader;
    FormView1.DataBind();
    reader.Close();
    reader1 = cmd1.ExecuteReader();
    ddl.DataSource = reader1;
    ddl.DataTextField = "firstname";
    ddl.DataBind();

提前致谢。

【问题讨论】:

  • 请查看更新后的代码。阅读器对象在绑定到两个控件后只需关闭一次。
  • 当然可以,但是现在有效吗?
  • 我没有得到异常。它工作正常。网格有它的数据,但表单视图什么都没有。(因为它无法绑定)。

标签: asp.net binding controls datareader


【解决方案1】:

SqlDataReader 是只转发阅读器。

提供一种从 SQL 读取只进行的流的方法 服务器数据库。

一旦数据被读取,您就无法再返回读取它。 这就是为什么您不能在不再次调用ExecuteReader 的情况下将同一个阅读器用作另一个控件的数据源。

如果您获得的行数很少,您可以将数据提取到DataSet 并将其绑定到两者。

SqlConnection conn = new SqlConnection(ConnectionString);
SqlDataAdapter da = new SqlDataAdapter();
SqlCommand cmd = conn.CreateCommand();
cmd.CommandText = "SELECT firstname,lastname FROM crudtable";
da.SelectCommand = cmd;
DataSet ds = new DataSet();
conn.Open();
da.Fill(ds);
conn.Close();

GridView1.DataSource = ds;
GridView1.DataBind();

FormView1.DataSource = ds;
FormView1.DataBind();
ddl.DataSource = ds;
ddl.DataTextField = "firstname";
ddl.DataBind();

在您的DataSet 中获得数据后,您可以决定Bind 并显示哪些列。

【讨论】:

  • 它没有绑定formview和dd1。
【解决方案2】:

对于这种情况下最精简的绑定版本,我将修改代码如下:

DataTable results = new DataTable();
using (SqlConnection connection = new SqlConnection(getconnectionstring()))
{
    connection.Open();
    using (SqlCommand command = new SqlCommand("SELECT firstname,lastname FROM crudtable",connection))
    {
        results.Load(command.ExecuteReader());
    }
}

GridView1.DataSource = results;
GridView1.DataBind();

FormView1.DataSource = results;
FormView1.DataBind();

ddl.DataSource = results;
ddl.DataTextField = "firstname";
ddl.DataBind();

【讨论】:

    【解决方案3】:

    如果 2 个控件未绑定到 1 个数据源,则获取该数据源并将其绑定到表,然后复制该表 并将其数据单独绑定到另一个表中。

    DataTable.clone() 将获取结构。 DatTable.Copy() 将获取架构和记录

    Clone reference

    Copy Reference

    【讨论】:

      【解决方案4】:

      最后我拿了一个新的阅读器对象来绑定表单视图,但它仍然没有工作。我是在某个地方错了还是错过了什么。 没有异常没有错误。 这是更新的代码。

          SqlConnection con = new SqlConnection(getconnectionstring());
          SqlCommand cmd = new SqlCommand();
          SqlCommand cmd1 = new SqlCommand();
          SqlCommand cmd2 = new SqlCommand();
      
         //cmd.CommandText = "SELECT firstname,lastname FROM crudtable";  
          cmd.CommandText = "SELECT firstname,lastname FROM crudtable";
          cmd2.CommandText = "SELECT firstname,lastname FROM crudtable";
          cmd1.CommandText = "SELECT firstname FROM crudtable";
      
          cmd.Connection = con;
          cmd1.Connection = con;
          cmd2.Connection=con;
          con.Open();
      
          SqlDataReader reader ;
          SqlDataReader reader1;
          SqlDataReader reader2;
          reader = cmd.ExecuteReader();
      
      
          GridView1.DataSource = reader;
          GridView1.DataBind();
          reader.Close();
          //reader.Close();
          reader2 = cmd2.ExecuteReader();
          FormView1.DataSource = reader2;
          FormView1.DataBind();
          reader2.Close();
          reader1 = cmd1.ExecuteReader();
          ddl.DataSource = reader1;
          ddl.DataTextField = "firstname";
          ddl.DataBind();
          reader1.Close();
      

      【讨论】:

        猜你喜欢
        • 2011-11-17
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-05-11
        • 2019-03-08
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多