MySqlCommand调用函数返回类型



我有一个关于这个的问题:

MySqlCommand call function

使用MariaDB

10.5.11-MariaDB-1:10.5.11+maria~focal

和给定函数(简化)

CREATE FUNCTION `activity_plugin_active`() RETURNS binary(1)
BEGIN
DECLARE result INT DEFAULT 0;
RETURN result;
END
为了在。net中获得函数的结果,我使用了一个辅助方法
bool activitiesPluginActive = 1 == ExecuteIntScalarAsync(
"activity_plugin_active", 
null, 
CancellationToken.None)
.GetAwaiter().GetResult();

但是这个方法有点笨重

private async Task<int> ExecuteIntScalarAsync(
string functionName, 
IEnumerable<DbParameter> parameters, 
CancellationToken cancellationToken = default)
{
using (MySqlConnection conn = new MySqlConnection(databaseConfiguration.GetConnectionString()))
{
await conn.OpenAsync();
MySqlCommand cmd = new MySqlCommand(functionName) 
{ 
CommandType = CommandType.StoredProcedure, 
Connection = conn 
};
if (parameters != null)
foreach (var parameter in parameters)
cmd.Parameters.Add(parameter);
var returnValue = new MySqlParameter("returnvalue", MySqlDbType.Int32)
{
Direction = ParameterDirection.ReturnValue
};
cmd.Parameters.Add(returnValue);

logger.LogInformation($"Executing { functionName }");
await cmd.ExecuteScalarAsync(cancellationToken);

// return value is byte[1], value 48
byte[] bytes = returnValue.Value as byte[];
// need to cast to string, value "0"
var sValue = System.Text.Encoding.Default.GetString(bytes);

// need to cast to int
return Convert.ToInt32(sValue);
}
}

正如你在上面的代码注释中看到的,返回值是一个字节[1]——对于给定的函数,它的值是48——数字0的ASCII码。虽然返回类型被定义为MySqlDbType.Int32.

如何直接返回一个整数而不需要强制转换两次?

这是因为在您的函数中,您指定返回函数的结果为binary(1)(即RETURNS binary(1))。你可以试着把它改成INT,像

CREATE FUNCTION `activity_plugin_active`() RETURNS INT
BEGIN
DECLARE result INT DEFAULT 0;
RETURN result;
END

最新更新