【发布时间】:2016-12-23 14:34:52
【问题描述】:
首先,为了清楚起见,我知道ExecuteNonQuery 应该只用于UPDATE, INSERT, or DELETE 语句,而对于所有其他类型的语句,例如 SELECT,返回值为 -1。
我的问题是,为什么下面的存储过程:
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();
}
}
如果没有找到带有 Name 的行,则返回 0 in returnVal,如果找到则返回 1?根据我阅读的所有文档,由于存储过程包含single SELECT statement,因此无论如何我都应该看到-1 被返回。相反,它返回受影响/找到的行数,根据文档,这没有意义。
最后,我也试过只使用"SELECT *" instead of "SELECT id, sp INTO ID, SP"。这似乎总是返回0。仍然不是我期待的-1。
【问题讨论】:
-
检查链接 msdn.microsoft.com/en-in/library/ms188774.aspx 以获取 Select 语句尝试设置
Set RowCount <Number>并进行测试。另请注意您提到的行为是特定于 Sql Server 的,对于不同的数据库可能会有不同的行为
标签: c# mysql stored-procedures