我在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中运行查询,它将提示您输入“ Username”和“ Password”参数,然后返回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.");
}
}
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句