1

以下のクエリに関連するすべての行をフェッチしたいのですが、すべての行ではなく 1 つの行だけが取得されたという問題があります。

if (!IsPostBack)
{
    string username = Session["username"].ToString();
    con.Open();
    string strqryScript = "select * from dbo.teachers where user_id = '" + username + "'";
    SqlCommand cmd = new SqlCommand(strqryScript, con);
    SqlDataAdapter da = new SqlDataAdapter(cmd);
    SqlDataReader rdr = cmd.ExecuteReader();
    rdr.Read();         
    string name  = rdr["teach_id"].ToString();
    rdr.Close();

    string query = "select * from dbo.teacher_classes where teach_id = '" + name + "' ORDER BY class_id";
    SqlCommand cmd2 = new SqlCommand(query, con);
    SqlDataAdapter da2 = new SqlDataAdapter(cmd2);
    SqlDataReader rdr2 = cmd2.ExecuteReader();
    while (rdr2.Read())
    {
        classname.Text = rdr2["class_id"].ToString();
    }
    con.Close();
}

gridview を使用してデータをバインドできますが、テーブルに多くのテーブルからのカスタム情報を入力したいので、html テーブルを使用してカスタム データを入力したいことに注意してください。助けてください!ありがとう ..

4

2 に答える 2

4

2 番目のリーダーでループしている間に、リーダーから抽出された値をclassnameラベルの Text プロパティに書き込みます。これにより、以前のテキストが上書きされ、最後に取得した教師の名前が残ります。前のテキストに追加するか、リストを使用する必要があります。

classname.Text += rdr2["class_id"].ToString();

そうは言っても、コードの大きな問題を指摘させてください。SQL コマンドを作成する場合、文字列の連結は非常によくありません。ここで説明されているように、構文エラー(入力テキストに一重引用符が含まれている場合)またはSQLインジェクションが返されます

このようなパラメーター化されたクエリを使用する必要があります(最初のコマンドのみ)

string strqryScript = "select * from dbo.teachers where user_id = @id";
SqlCommand cmd = new SqlCommand(strqryScript, con);
cmd.Parameters.AddWitValue("@id", username);
....
于 2013-05-17T15:45:13.627 に答える