Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# System.Data.SqlClient.SqlException:“`”附近的语法不正确_C#_Sql Server_Asp.net Mvc_Visual Studio - Fatal编程技术网

C# System.Data.SqlClient.SqlException:“`”附近的语法不正确

C# System.Data.SqlClient.SqlException:“`”附近的语法不正确,c#,sql-server,asp.net-mvc,visual-studio,C#,Sql Server,Asp.net Mvc,Visual Studio,我正在尝试使用ASP.NET创建一个登录字段,它将从文本框字段中获取输入,并根据数据库中的用户表检查它们。这些列是用户ID和密码。但这是一个错误 System.Data.SqlClient.SqlException:'附近的语法不正确'`' 使用登录表单时显示。我看不出语法有任何问题 我是新手,所以如果错误很明显,请原谅 public partial class Login_Page : System.Web.UI.Page { protected void Page_Load(obje

我正在尝试使用ASP.NET创建一个登录字段,它将从文本框字段中获取输入,并根据数据库中的用户表检查它们。这些列是用户ID和密码。但这是一个错误

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();
    }
}
只需删除“`”字符就可以了

您的代码易受注入攻击。请尝试使用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所提到的,用户id不是有效的列名,它应该类似于用户id,或者如果其中有空格,则应该类似于:[user id]

您的代码有很多问题:

不要在程序或应用程序配置中存储纯文本密码。 不要在程序中嵌入连接字符串 `不是SQL Server语法。 如果输入来自用户,请不要在查询中特别使用字符串连接。使用参数化查询。

完成工作后,请始终处理对象。为此,请使用SqlConnection conn=new SqlConnection。 所有实现IDisposable的方法都可以在using语句中使用
只需删除“`”字符,它就会起作用。您确定要使用SQL Server吗?Backtick`是MySQL的引号字符。你的申请也有两个主要问题;SQL不是参数化的,这意味着它可以被注入,并且您将密码存储为纯文本。密码应该是散列和盐析的。在进一步操作之前,您需要解决这些问题。这不是构建SQL的正确方法—使用参数—密码永远不应以明文形式存储。在SQL Server中,除非将列名放在方括号中,否则在列名中加空格(如用户id)是不起作用的。另外,user是一个保留的T-SQL关键字,所以也不能用作表名——除非您也将其放在方括号中。因此,您需要使用:选择[user id],[user]中的密码…一个带有空格的列名,就像user id在SQL Server中不起作用一样-除非将其放在方括号中。另外,user是一个保留的T-SQL关键字,所以也不能用作表名——除非您也将其放在方括号中。因此,您需要使用:选择[user id],[user]中的密码…我建议添加一个关于密码的注释,存储纯文本密码是一个非常糟糕的主意。@marc_s是的,您是对的,实际上我没有看到。@Wraithrider很好,除了它本身转换数据类型,您不需要在“”之间扭曲字符串,因为它知道应该这样做,并且自己也会这样做,例如cmd.parameters。Add@date,SqlDbType.DateTime.Value=DateTime.Now;。但是,否则,您必须将datetime格式化为sql能够理解的兼容字符串格式,…@Wraithrider,是的,您遵循的是一个糟糕的教程。对于参数,包含参数令牌的SQL语句将作为RPC请求发送到SQL Server。该请求包括本机形式的强类型参数值,数据库引擎可以按原样使用,无需解析。这不仅阻碍了SQL注入,而且帮了大忙,谢谢!是的,纯文本是绝对不行的,以后将作为散列存储,但我担心在我处理更复杂的事情之前,我需要先从数据库的其他部分获得一些更基本的知识!另外,有可能听起来很愚蠢,嵌入连接字符串有什么问题?还有什么更好的选择?谢谢你的帮助!最好在SQL方面使用SSMS来获得经验,并更好地正确编码:如果你觉得这个答案对你有帮助,请考虑向上投票:谢谢你在需要改变连接字符串时需要编译嵌入的连接字符串。嵌入到应用程序中的字符串可以很容易地反编译。
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);

     ....
}