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

时间:2015-04-01 05:26:06

标签: c# ms-access odbc

我在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:

  

错误[07002] [Microsoft] [ODBC Microsoft Access驱动程序]太少   参数。预计2。

1 个答案:

答案 0 :(得分:1)

您的第一个问题是您的查询使用的参数名称与相应的字段名称相同。如果您尝试在Access中运行查询,它将提示您输入“用户名”和“密码”参数,然后返回tblUsers 中的所有行,而不管您输入的参数值。那是因为当Access SQL解析器处理

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

...它将[Username][Password]解释为字段名称,而不是参数名称,结果与

... 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.");
            }
        }
    }
}