我正在开发一个带有一些数据库的C#项目。我在执行以下功能时遇到错误:
//Returns true if the username and password are correct. Otherwise it returns false.
public bool LogInto(string name, string pass, OleDbConnection cnx)
{
DataTable res = new DataTable();
OleDbDataAdapter adp = new OleDbDataAdapter("SELECT User,Password FROM UserPassword WHERE (User='"+name+"' AND Password='"+pass+"')", cnx);
adp.Fill(res);
bool found = false;
String user = Convert.ToString(res.Rows[0]["User"]);
String password = Convert.ToString(res.Rows[0]["Password"]);
if (name==user && pass==password)
found = true;
return found;
}
所以这是完整的功能,但是我收到了一个错误,我刚刚更换了&&与AND。但它仍然无效。我得到了(“解析查询时出错.//令牌号,令牌行偏移量,错误令牌。
它出了什么问题?我有相同的功能,但它没有从数据表中只占用一行,而是占用了整个表,并且循环显示了我们正在寻找的行。但是,我正在尝试这样做,只需要我们需要的行,因为它更有效。
你能帮助我吗?我找不到我的错误。 非常感谢你答案 0 :(得分:1)
您的查询存在一些问题:
and
,而不是&&
你可以这样做:
string query =
"SELECT User, Password FROM UserPassword WHERE Username = '" +
name.Replace("\\", "\\\\").Replace("'", "\\'") +
"' and Password = '" +
pass.Replace("\\", "\\\\").Replace("'", "\\'") +
"'";
注意:这种转义字符串的方法是MySQL特有的。每个数据库都有一组不同的字符,需要以不同的方式进行转义。
如果可能,您应该使用参数化查询,而不是将字符串连接到查询中。这样可以更容易地使其正确。
答案 1 :(得分:0)
首先请使用IDisposable继承的
这样的参数化方法using(SqlCommand cmd = new SqlCommand())
{
cmd.CommandType = CommandType.Text;
cmd.CommandText = @""SELECT up.User, up.Password FROM dbo.UserPassword up WHERE up.Username = @Param1" AND Password = @Param2;
cmd.Parameters.Add("@Param1", SqlDbType.Varchar).Value = 'ABC';
.............
}
第二次尝试加密或散列它,网上有很多关于散列和加密的信息