我在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。
答案 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.");
}
}
}
}