首先,为了清楚起见,我认识到ExecuteNonQuery
只应用于UPDATE, INSERT, or DELETE
语句,对于所有其他类型的语句(如SELECT),返回值为-1。了解ExecuteNonQuery的返回值
我的问题是,为什么下面的存储过程:
CREATE PROCEDURE `ExampleProc`(IN Name varchar(60), OUT ID bigint(20), OUT SP varchar(255))
BEGIN
SELECT id, sp INTO ID, SP FROM users WHERE username = Name;
END
当使用ExecuteNonQuery
执行:
using (var conn = new MySqlConnection("Secret"))
{
conn.Open();
using (var cmd = new MySqlCommand("ExampleProc", conn) { CommandType = CommandType.StoredProcedure })
{
cmd.Parameters.AddWithValue("Name", request.Name).MySqlDbType = MySqlDbType.VarChar;
cmd.Parameters.Add("ID", MySqlDbType.Int64).Direction = ParameterDirection.Output;
cmd.Parameters.Add("SP", MySqlDbType.VarChar).Direction = ParameterDirection.Output;
var returnVal = cmd.ExecuteNonQuery();
}
}
产生0 in returnVal
时名称行没有找到,并且1
如果找到了?根据我已阅读的所有文档,由于存储过程包含single SELECT statement
,因此无论如何我都应该看到-1
被返回。相反,它会返回受影响/找到的行数,根据文档,这是没有意义的。
最后,我也试过只用"SELECT *" instead of "SELECT id, sp INTO ID, SP"
。这似乎总是返回0
。仍然不是我期待的-1
。
检查链接 https://msdn.microsoft.com/en-in/library/ms188774.aspx 对于Select语句尝试设置'Set RowCount'并测试。另外请注意你提到的行为是针对Sql Server的,对于不同的数据库可能表现不同 –