1

我想获取与下面的查询相关的所有行,我的问题是只有一行没有检索到所有行,我将 asp.net 与 c# 和 ado.net 一起使用,我的代码逻辑是

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

在第二个阅读器上循环时,您将从阅读器中提取的值写入classname标签的 Text 属性。这将覆盖以前的文本,并为您留下最后检索到的老师的姓名。您需要添加到前面的文本或使用列表。

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

说,让我指出你的代码中的一个大问题。构建 sql 命令时,字符串连接真的很糟糕。它会返回语法错误(如果您的输入文本包含单引号)或 Sql Injection,如此处所述

您应该使用这样的参数化查询(仅适用于您的第一个命令)

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 回答
0

这是您需要解决的问题:

classname.Text = rdr2["class_id"].ToString(); <== always setting the same text!!

您需要确保在读取数据时填写列表、数据集或其他任何内容!

于 2013-05-17T15:49:51.270 回答