如何将参数传递给对象查询?
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.");
}
}
}
}
我在 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.");
}
}
}
}