1

同じデータ リーダー オブジェクトを 2 つのコントロールにバインドしようとしています。1 つは gridview で、2 番目は 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

取得する行数が少ない場合は、データを にフェッチして、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表示するかを決定できます。

于 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

最後に、新しいリーダー オブジェクトを取得してフォームビューをバインドしましたが、それでも機能しませんでした。どこか間違っているか、何かが欠けています。例外もエラーもありません。これは更新されたコードです。

    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 に答える