如何将参数传递给对象查询?

How to pass parameters to an object query?

我在 MS Access (getUserLogin) 中有一个对象查询将执行以下操作:

PARAMETERS prmUsername Text, prmPassword Text;

SELECT ID, LastName, FirstName, MiddleName
FROM tblUsers
WHERE Username = [prmUsername] AND Password = [prmPassword];

我的 C# 中有一个方法可以在 MS Access (getUserLogin) 中执行对象查询。

public bool login(string username, string password)
{
    com = new OdbcCommand("EXEC getUserLogin", con);

    com.CommandType = CommandType.StoredProcedure;

    com.Parameters.Add("prmUsername", OdbcType.Text).Value = username;
    com.Parameters.Add("prmPassword", OdbcType.Text).Value = password;

    con.Open();

    rea = com.ExecuteReader(); //OdbcException goes here

    if (rea.HasRows == true)
        return true;
    else
        return false;
}

我收到这个 OdbcException:

ERROR [07002] [Microsoft][ODBC Microsoft Access Driver] Too few parameters. Expected 2.

您的第一个问题是您的查询使用的参数名称与相应的字段名称相同。如果您尝试 运行 您在 Access 中的查询,它将提示您输入 "Username" 和 "Password" 参数,然后 return tblUsers 中的所有行,无论您输入的参数值。那是因为当 Access SQL 解析器处理

... WHERE Username = [Username] AND Password = [Password]

... 它将 [Username][Password] 解释为 field 名称,而不是 parameter 名称,并且结果与

相同
... WHERE True AND True

因此,您需要做的第一件事就是更改参数名称。一个相对常见的约定是对参数名称使用 "prm" 前缀,因此您的查询将是

PARAMETERS prmUsername Text, prmPassword Text;
SELECT [ID], [LastName], [FirstName], [MiddleName]
FROM [tblUsers]
WHERE [Username] = [prmUsername] AND [Password] = [prmPassword];

现在,要在您的 C# 应用程序中传递您的参数值,您需要使用 System.Data.OleDb(不是 .Odbc)和类似这样的代码

using (var con = new OleDbConnection(myConnectionString))
{
    con.Open();
    using (var cmd = new OleDbCommand())
    {
        cmd.Connection = con;
        cmd.CommandType = CommandType.StoredProcedure;
        cmd.CommandText = "loginQuery";
        cmd.Parameters.Add("prmUsername", OleDbType.VarWChar).Value = "eric";
        cmd.Parameters.Add("prmPassword", OleDbType.VarWChar).Value = "abcdefg";
        using (OleDbDataReader rdr = cmd.ExecuteReader())
        {
            if (rdr.Read())
            {
                Console.WriteLine("Row found: ID = {0}", rdr["ID"]);
            }
            else
            {
                Console.WriteLine("Row not found.");
            }
        }
    }
}