SQL查询语句

时间:2014-12-06 15:10:23

标签: c# mysql

我正在开发一个带有一些数据库的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。但它仍然无效。我得到了(“解析查询时出错.//令牌号,令牌行偏移量,错误令牌。

它出了什么问题?我有相同的功能,但它没有从数据表中只占用一行,而是占用了整个表,并且循环显示了我们正在寻找的行。但是,我正在尝试这样做,只需要我们需要的行,因为它更有效。

你能帮助我吗?我找不到我的错误。 非常感谢你

2 个答案:

答案 0 :(得分:1)

您的查询存在一些问题:

  • SQL中的and运算符为and,而不是&&
  • 查询广泛开放SQL INJECTION攻击。您必须转义字符串才能正确解释为字符串文字。

你可以这样做:

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';
    .............
}

第二次尝试加密或散列它,网上有很多关于散列和加密的信息