尝试在不指定返回参数的情况下调用存储的函数“dbname”。“functionname”
Posted
技术标签:
【中文标题】尝试在不指定返回参数的情况下调用存储的函数“dbname”。“functionname”【英文标题】:Attempt to call stored function "dbname"."functionname" w/o specifying a return parameter 【发布时间】:2013-03-22 04:51:16 【问题描述】:我该如何解决这个问题?我缺少我的代码或功能代码吗?
这是我的 C# 代码
public int AddDetails(string business, string clerkid, string serverid, string ticket, string tablenumber,
string sourcecard, string recipientcard, DateTime datesaved, string status)
CreateConnection();
int dbId = 0;
using(cmd = new mysqlCommand())
cmd.Connection = cn;
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandText = "AddDetails";
cmd.Parameters.AddWithValue("m_business", business);
cmd.Parameters.AddWithValue("m_clerkid", clerkid);
cmd.Parameters.AddWithValue("m_serverid", serverid);
cmd.Parameters.AddWithValue("m_ticket", ticket);
cmd.Parameters.AddWithValue("m_tablenumber", tablenumber);
cmd.Parameters.AddWithValue("m_sourcecard", sourcecard);
cmd.Parameters.AddWithValue("m_recipientcard", recipientcard);
cmd.Parameters.AddWithValue("m_datesaved", datesaved);
cmd.Parameters.AddWithValue("m_status", status);
cn.Open();
//dbId = Convert.ToInt32(cmd.LastInsertedId);
dbId = int.Parse(cmd.ExecuteScalar().ToString());
//dbId = Convert.ToInt32(cmd.ExecuteNonQuery());
cn.Close();
return dbId;
这是我存储的函数
CREATE DEFINER=`root`@`192.168.21.%` FUNCTION `AddDetails`(
m_business VARCHAR(1),
m_clerkid VARCHAR(45),
m_serverid VARCHAR(45),
m_ticket VARCHAR(45),
m_tablenumber VARCHAR(45),
m_sourcecard VARCHAR(45),
m_recipientcard VARCHAR(45),
m_datesaved DATETIME,
m_status VARCHAR(45)
) RETURNS int(11)
READS SQL DATA
BEGIN
INSERT INTO `tbl_merchantwarehouse_transaction`
(
`business`,
`clerkid`,
`serverid`,
`ticket`,
`tablenumber`,
`sourcecardnumber`,
`recipientcardnumber`,
`datesaved`,
`status`
)
VALUES(
m_business,
m_clerkid,
m_serverid,
m_ticket,
m_tablenumber,
m_sourcecard,
m_recipientcard,
m_datesaved,
m_status
);
RETURN LAST_INSERT_ID();
END
对我的代码的任何建议、建议/改进将不胜感激。谢谢你:D
【问题讨论】:
【参考方案1】:您应该使用您的命令指定返回参数,例如:
cmd.Parameters.Add("@ireturnvalue", MySqlDbType.Int32);
cmd.Parameters["@ireturnvalue"].Direction = ParameterDirection.ReturnValue;
【讨论】:
@cheol.lui,在cmd.ExecuteScalar
之后,试试int dbId = Convert.ToInt32(cmd.Parameters["@ireturnvalue"].Value);
【参考方案2】:
不能使用ExecuteScalar函数的返回值——需要返回returnValue的参数值:
public async Task<int> ExecuteIntScalarAsync(string functionName, IEnumerable<MySqlParameter> parameters)
using (var con = new MySqlConnection(connectionString))
await con.OpenAsync();
MySqlCommand cmd = new MySqlCommand(functionName) CommandType = System.Data.CommandType.StoredProcedure, Connection = con ;
if (parameters != null)
foreach (var parameter in parameters)
cmd.Parameters.Add(parameter);
var returnValue = new MySqlParameter("returnvalue", MySqlDbType.Int32);
returnValue.Direction = ParameterDirection.ReturnValue;
await cmd.ExecuteScalarAsync();
return (int)returnValue.Value;
【讨论】:
以上是关于尝试在不指定返回参数的情况下调用存储的函数“dbname”。“functionname”的主要内容,如果未能解决你的问题,请参考以下文章
如何在不指定列名的情况下使用 bigquery 对表中的每一列调用内置函数?