我为SQL Server 2014创建了一个存储过程。
有两个参数:Name
是用户名,Hash
是密码md5哈希。我检查数据库中md5哈希值是否相等(第一个哈希来自程序,第二个哈希值已经存储在数据库中)。
如果我只是在数据库中(或在使用commandType.Text
的程序中)运行查询(而不是存储过程) - 一切正常并且用户正在被选中,但是当我运行确切的东西但使用存储过程时,C#中的SqlReader
没有返回元素,这很可能意味着不满足这些变量比较中的条件。
也许我做错了什么?
我还有大约10个其他用于读取和/或写入数据库的存储过程,除了这个之外,一切都有效。
以下是程序:
CREATE PROCEDURE GetHash
@Name nvarchar(50),
@Hash nvarchar(200)
AS
BEGIN
SET NOCOUNT ON;
SELECT Orders.orderId, Employee.name, Employee.surname
FROM Orders
LEFT JOIN Employee ON Orders.orderId = Employee.id
WHERE batchName = '@Name' AND productCode = '@Hash'
END
GO
代码部分:
public Boolean VerifyPassword(string name, string password)
{
var paramsList = new List<SqlParameter> { new SqlParameter("@Name", name), new SqlParameter("@Hash", GetMd5Hash(password)) };
const string ProcedureName = "GetHash";
var ActiveUser = new DBController().GetFromDatabase(ProcedureName, "Login", "EJL15_DB", paramsList).ToList();
return ActiveUser.Count > 0;
}
来自数据库控制器
private void SetCommandProperties(string procedureName, IEnumerable<SqlParameter> paramsList)
{
this.sqlCommand.CommandText = procedureName;
this.sqlCommand.CommandType = CommandType.StoredProcedure;
foreach (var curParam in paramsList)
this.sqlCommand.Parameters.Add(curParam);
this.sqlCommand.CommandTimeout = 15;
}
答案 0 :(得分:1)
您不需要引用存储过程中的参数。这样做:
CREATE PROCEDURE GetHash
@Name nvarchar(50),
@Hash nvarchar(200)
AS
BEGIN
SET NOCOUNT ON;
SELECT Orders.orderId,
Employee.name,
Employee.surname
FROM Orders
LEFT JOIN Employee
ON Orders.orderId=Employee.id
WHERE batchName = @Name
AND productCode = @Hash
END
答案 1 :(得分:0)
“WHERE batchName ='@ Name'AND productCode ='@ Hash '”
您的病情有可能不正确吗?我想它应该是这样的:Employee.password = @Hash