我可以将相同的数据读取器对象绑定到 2 个控件吗?

Posted

技术标签:

【中文标题】我可以将相同的数据读取器对象绑定到 2 个控件吗?【英文标题】:Can i bind same datareader object to 2 controls? 【发布时间】: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();

提前致谢。

【问题讨论】:

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

【讨论】:

以上是关于我可以将相同的数据读取器对象绑定到 2 个控件吗?的主要内容,如果未能解决你的问题,请参考以下文章

datacombo必须绑定到控件吗

如何:用BindingSource将Windows Forms控件绑定到工厂对象

我可以将 HTML 绑定到 WPF Web 浏览器控件吗?

数据绑定技术一:GridView控件

我可以将 WPF ComboBox 控件的可见性绑定到从命令获得的项目的存在/不存在吗? [关闭]

在两个控件之间共享绑定源不起作用