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

C# 如何将参数传递给对象查询?,c#,ms-access,odbc,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中执行

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


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

... 其中Username=[Username]和Password=[Password] 。。。它将[Username]和[Password]解释为字段名,而不是参数名,结果与

... 哪里是真的 因此,您需要做的第一件事是更改参数名称。一个比较常见的约定是使用prm前缀作为参数名,因此您的查询将是

参数prmUsername Text、prmPassword Text; 选择[ID]、[LastName]、[FirstName]、[MiddleName] 来自[tblUsers] 其中[Username]=[prmUsername]和[Password]=[prmPassword]; 现在,要在C应用程序中传递参数值,需要使用System.Data.OleDb not.Odbc和类似的代码

使用var con=new OleDbConnectionmyConnectionString { 不公开; 使用var cmd=new OleDbCommand { cmd.Connection=con; cmd.CommandType=CommandType.storedProcess; cmd.CommandText=loginQuery; cmd.Parameters.AddprmUsername,OleDbType.VarWChar.Value=eric; cmd.Parameters.AddprmPassword,OleDbType.VarWChar.Value=abcdefg; 使用OleDbDataReader rdr=cmd.ExecuteReader { 如果rdr.Read { 找到Console.WriteLineRow:ID={0},rdr[ID]; } 其他的 { 找不到Console.WriteLineRow。; } } } }
使用SQLParameter如果要在C应用程序中使用保存的Access参数查询,则需要使用System.Data.OleDb,而不是.Odbc。Access ODBC驱动程序不像OLEDB提供程序那样将这些查询视为存储过程。我注意到,即使我在c代码中更改参数名称,并将它们命名为不同的名称,但在qryLogin中,它仍然接受这些参数作为两个输入