1

我正在使用 SQL Datareader 填充 .aspx 页面中的文本框。我的下面

#region "[--------Function To Fill Up All TextBox---------]>"
public void FillTextBox(string Sqlstring)
{


    SqlConnection Conn =  new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString);
    SqlDataReader MyDataReader = null;
    SqlCommand MyOleDbCommand = new SqlCommand();
    MyOleDbCommand.Connection = (Conn);
    Conn.Open();
    MyOleDbCommand.CommandText = Sqlstring;
    MyDataReader = MyOleDbCommand.ExecuteReader();
    try
    {

        while (MyDataReader.Read())
        {

            txtuniv.Text = (MyDataReader[0].ToString());
            txtcollrno.Text = (MyDataReader[1].ToString());
            /*txtLastName.Text = (MyDataReader[2].ToString());
            txtClass.Text = (MyDataReader[3].ToString());
            txtSession.Text = (MyDataReader[4].ToString());
            txtobt.Text = (MyDataReader[5].ToString());
            txttot.Text = (MyDataReader[6].ToString());

            */
        }
    }
    catch (System.Exception err)
    {
        MyDataReader.Close();
        Conn.Close();
        Conn.Dispose();
    }

}
#endregion

在 PageLoad() 事件中

    protected void Page_Load(object sender, EventArgs e)
{
    Label1.Text = User.Identity.Name.ToString();
 
    string SqlStr = null;
    SqlStr = "Select * from TB_User where UserID=" + Label1.Text;
    FillTextBox(SqlStr);
}

我有表 TB_User,其中包含 UserID 和 Password 列。它分别具有值 test1 和 test1。但它给出了以下错误:

Description: An unhandled exception occurred during the execution of the current web request. Please review the stack trace for more information about the error and where it originated in the code.
Exception Details: System.Data.SqlClient.SqlException: Invalid column name 'test1'.

Source Error:


Line 40:         Conn.Open();
Line 41:         MyOleDbCommand.CommandText = Sqlstring;
Line 42:         MyDataReader = MyOleDbCommand.ExecuteReader();
Line 43:         try
Line 44:         {
4

6 回答 6

3

您忘记在参数周围添加单引号。

"Select * from TB_User where UserID='" + Label1.Text +"'";
  1. 但是,您可以接受SQL 注入。不要连接字符串来构建您的查询。而是使用参数。
  2. 用于using-statement您的连接(以及所有其他实现IDisposable)。Dispose 也会关闭连接,using即使出现错误。

这是一个例子:

using (var con = new SqlConnection(ConfigurationManager.ConnectionStrings["SQL Connection String"].ConnectionString)) {
    var sql = "Select * from TB_User where UserID=@UserID";
    using (var cmd = new SqlCommand(sql, con)) {
        cmd.Parameters.AddWithValue("@UserID", Label1.Text);
        con.Open();
        using(var reader = cmd.ExecuteReader())
        {
            while(reader.Read())
            {
                // ...
            }
        }
    }
}
于 2012-10-15T08:44:51.627 回答
2

UserID 必须封装'在查询中。

SqlStr = "Select * from TB_User where UserID='" + Label1.Text + "'";
于 2012-10-15T08:43:51.553 回答
2

尝试更改以下内容:

SqlStr = "Select * from TB_User where UserID=" + Label1.Text;

到:

SqlStr = string.Format("Select * from TB_User where UserID='{0}'",Label1.Text);

在原始版本中,数据库认为您正在寻找列 Test1 而不是与值“Test1”进行比较

于 2012-10-15T08:44:02.420 回答
1

试试这个,在 userID 周围加上引号

SqlStr = "Select * from TB_User where UserID='" + Label1.Text + "'";

考虑在您的代码中使用参数化查询 - 避免 SQL 注入攻击并避免可能损坏 SQL 语法的意外字符

SqlStr = "Select * from TB_User where UserID=@UserID";
于 2012-10-15T08:44:49.893 回答
1

从安全角度来看,您的代码很糟糕。此行要求进行 Sql 注入:

SqlStr = "Select * from TB_User where UserID=" + Label1.Text;

此外,您应该将对象放在 finally 块中,而不是在 catch 中,因为这样您只会在出现问题时释放资源。

第三也是最后,在查询中指定列名并告诉我们它是如何进行的。

于 2012-10-15T08:45:47.893 回答
0

检查列名的拼写是否正确。

于 2020-11-06T10:06:25.183 回答