我可以将相同的数据读取器对象绑定到 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 个控件吗?的主要内容,如果未能解决你的问题,请参考以下文章
如何:用BindingSource将Windows Forms控件绑定到工厂对象