1

我正在尝试将相同的数据读取器对象绑定到 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();

提前致谢。

4

4 回答 4

4

SqlDataReader是只向前的阅读器。

提供一种从 SQL Server 数据库中读取只进的行流的方法。

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

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

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显示哪些列。

于 2012-09-01T14:04:38.053 回答
3

在这种情况下,对于最精简的绑定版本,我会像这样修改代码:

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();
于 2012-09-01T19:01:54.770 回答
1

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

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

克隆参考

复制参考

于 2012-09-03T20:15:52.063 回答
0

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

    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();
于 2012-09-03T04:50:30.367 回答