Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/37.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
ASP.NET中使用C#with Access数据库的UPDATE语句中出现语法错误_C#_Asp.net_Ms Access - Fatal编程技术网

ASP.NET中使用C#with Access数据库的UPDATE语句中出现语法错误

ASP.NET中使用C#with Access数据库的UPDATE语句中出现语法错误,c#,asp.net,ms-access,C#,Asp.net,Ms Access,当我运行下面的Access语句时,我得到了一个“更新语句中的语法错误”错误。我怎样才能克服这一点 这是我的网页代码的相关部分 protected void Button1_Click(object sender, EventArgs e) { string connect = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=C:\\Users\\Prasat PVS\\Documents\\db.mdb"; string q1 = "

当我运行下面的Access语句时,我得到了一个“更新语句中的语法错误”错误。我怎样才能克服这一点

这是我的网页代码的相关部分

protected void Button1_Click(object sender, EventArgs e)
{
    string connect = "Provider=Microsoft.Jet.OleDb.4.0;Data Source=C:\\Users\\Prasat PVS\\Documents\\db.mdb";

    string q1 = "SELECT * FROM users WHERE password ='" + TextBox1.Text + "'";

    string q2 = "UPDATE users SET password='"+TextBox2.Text+"' WHERE password='"+TextBox1.Text+"'";

    using (OleDbConnection con = new OleDbConnection(connect))
    {
        con.Open();

        using (OleDbCommand cmd = new OleDbCommand(q1, con))
        {
            OleDbDataReader dr = cmd.ExecuteReader();

            if (dr.Read())
            {
                using (OleDbConnection con1 = new OleDbConnection(connect))
                {
                    con1.Open();

                    using (OleDbCommand cmd1 = new OleDbCommand(q2, con1))
                    {
                        cmd1.ExecuteNonQuery();
                    }

                    Label1.Text = "Your Password Has Been Changed Successfully";

                    con1.Close();
                    con.Close();
                }
            }
            else
            {
                Label1.Text = "Your Password Is Incorrect Try Again";
            }
        }
    }
}

我打赌你的密码里有一个撇号。如果是这样的话,您将有类似于
updateuserssetpassword='pass'word'…
的东西,这显然是错误的语法。这是我能看到的最有可能导致这样一个错误的事情

参数化查询的另一个要点


虽然您在这里,我在一篇评论中提到了这一点,但是您最好只运行一个查询(在您添加用户名检查后的更新),然后检查
ExecuteNonQuery
的结果,以了解是否有任何行受到影响(密码更改成功)(用户名或密码不正确).

问题可能是因为您使用密码作为密码字段的名称。。。首先,您的应用程序容易受到SQL注入的攻击,而不是使用pass或其他方法,即使用参数化查询。其次,存储明文密码是一件可怕的事情。只是想指出一个逻辑缺陷:如果两个用户拥有相同的密码怎么办?您当前的逻辑将更改每个共享原始密码的用户的密码。除了这些其他问题外,我不知道您为什么要将更新嵌套在select中。您的
q1
仅用于测试该用户是否存在,但您的更新已经完成了这项工作。这只会占用资源,造成巨大的网络浪费。而且,这一点也不太严重,但为什么不使用ASP内置的身份验证平台呢?我不确定是否使用Identity,但可以肯定的是,在您可以使用Forms身份验证来覆盖行为并匹配您的数据库之前,是否使用了任何东西。虽然Azure提供了20MB的免费真实SQL,但这比访问web服务要好得多。
“更新用户设置密码=”+TextBox2.Text+“'WHERE password=”+TextBox1.Text+“”
这是真实的生活吗?还是这是幻想?如果两个用户共享相同的密码呢?或者给出一些建议来改进我的密码更改选项,而不使用.net中的更改密码控件……我认为您已经开始了,您只需要稍微更改一下实现。听起来其他人给了你一些好的起点。您应该首先在
WHERE
子句中添加一个测试,以在更改密码之前检查用户名。您还应该实现查询参数化,这方面有很多例子。那么它对你来说应该是完美的。