System.Data.SqlClient.SqlException:'''附近的语法不正确。'

时间:2019-02-23 15:54:31

标签: c# sql-server asp.net-mvc visual-studio

我正在尝试使用ASP.NET创建一个登录字段,该字段将从文本框字段中输入内容,并对照数据库中的“ user”表对其进行检查。列为User IDPassword。但是有错误

  

System.Data.SqlClient.SqlException:'''附近的语法不正确

使用登录表单时出现

。我没有看到语法上的任何问题...

我是新手,所以如果错误很明显,请原谅!

public partial class Login_Page : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        lblErrorMessage.Visible = false;
        SqlConnection con = new SqlConnection("Data Source=JACKS-PC\\SQLEXPRESS;Initial Catalog=CBR;Integrated Security=True");
        con.Open();
    }

    protected void btnLogin_Click(object sender, EventArgs e)
    { 
            SqlConnection con = new SqlConnection();
            con.ConnectionString = "Data Source=JACKS-PC\\SQLEXPRESS;Initial Catalog=CBR;Integrated Security=True";
            con.Open();

            string userid = txtUsername.Text.Trim();
            string password = txtPassword.Text.Trim();

            SqlCommand cmd = new SqlCommand("select `user id`,`password` from user where `user id`='" + txtUsername.Text + "'and `password`='" + txtPassword.Text + "'", con);

            SqlDataAdapter da = new SqlDataAdapter(cmd);
            DataTable dt = new DataTable();

            da.Fill(dt);

            if (dt.Rows.Count > 0)
            {
                Session["username"] = txtUsername.Text.Trim();
                Response.Redirect("Homepage.aspx");
            }
            else
            {
                lblErrorMessage.Visible = true;
            }

            con.Close();
    }
}

2 个答案:

答案 0 :(得分:3)

  1. 只需删除“`”字符即可使其正常工作。

  2. 您的代码容易被注入,请尝试使用SqlCommand.Parameters.Add()方法添加值。

使用此代码:

SqlCommand cmd = new SqlCommand("select userid, password from user where user id = @id and password = @password", con);

cmd.Parameters.Add("@id", SqlDbType.VarChar).Value = txtUsername.Text;
cmd.Parameters.Add("@password", SqlDbType.VarChar).Value = txtPassword.Text;

正如@marc_s所述,user id不是有效的列名,应该像userid一样,或者如果其中有空格应该像是:[user id]

答案 1 :(得分:1)

您的代码有很多问题:

  1. 请勿在程序或应用程序配置中存储纯文本密码。
  2. 请勿将连接字符串嵌入程序中
  3. `不是SQL Server语法。
  4. 尤其在输入来自用户的情况下,切勿在查询中使用字符串连接。使用参数化查询。

using (SqlCommand cmd = new SqlCommand("select 1 from tbl where id=@id", conn))
{
     var idParameter = new SqlParameter()
     idParameter.ParameterName = "@id";
     idParameter.Value         = 1234; 
     cmd.Parameters.Add(idParameter);

     ....
}
    当您完成对对象的处理时,
  1. 始终会对其进行处理。为此使用using(SqlConnection conn = new SqlConnection())
    • 所有实现IDisposable的方法都可以在using语句中使用