我有这样的程序吗?
DELIMITER $$
CREATE DEFINER=`root`@`localhost` PROCEDURE `check_user`(in username varchar(100), in pass varchar(5000))
BEGIN
select * from users where email=username and password = pass;
END$$
DELIMITER ;
所以我打电话给这样的程序。
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "get_user";
cmd.Parameters.AddWithValue("@username", un);
cmd.Parameters.AddWithValue("@pass", Security.Encrypt(pass));
int result = cmd.ExecuteNonQuery();
它将结果显示为0.因为没有任何行受到影响。在这种情况下无法识别用户是否存在。用户是否存在或总是为0. 那么我如何才能让用户存在?
答案 0 :(得分:0)
不应在SELECT语句中使用ExecuteNonQuery。
ExecuteNonQuery方法用于执行“数据操作语言”。这仅在INSERT,DELETE和UPDATE中使用。
ExecuteScalar方法将在SELECT语句的第一行,第一列中返回单个值。因此,可以使用SELECT COUNT(*)..更改查询。
ExecuteReader方法将返回SELECT的结果集。当您查询一堆结果(例如表中的行等)时,将使用此方法。
使用以下命令更改您的查询:
SELECT COUNT(*) FROM users WHERE email=username AND password = pass;
并使用ExecuteScalar()并准备好了。
或者您可以使用DataAdapter Fill:
MySqlCommand cmd = conn.CreateCommand();
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "get_user";
cmd.Parameters.AddWithValue("@username", un);
cmd.Parameters.AddWithValue("@pass", Security.Encrypt(pass));
DataTable data = new DataTable();
using (MySqlDataAdapter da = new MySqlDataAdapter(cmd))
{
da.Fill(data);
}
if (data.Rows.Count > 0)
result = Convert.ToInt32(data.Rows[0][0].ToString());
了解更多here。