You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

MariaDB中MySqlCommand调用存储函数如何直接获取整型返回值

你遇到的类型转换问题根源是存储函数的返回类型定义和C#侧声明的返回参数类型不匹配:你当前的存储函数声明返回binary(1),MariaDB会直接返回字节流数据,哪怕你在C#中将返回参数指定为MySqlDbType.Int32,MySqlConnector驱动也只会返回原始的二进制字节数组。

方案1:修改存储函数返回类型(最推荐)

既然你的存储函数本身返回的是0/1的整型标识,直接将返回类型改为数值类型即可,无需用二进制类型存储:

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

修改后C#侧不需要再做字节、字符串转换,直接读取返回值即可:

// 省略其他逻辑,直接替换返回部分代码
return Convert.ToInt32(returnValue.Value);

方案2:不修改存储函数,简化C#侧转换逻辑

如果无法调整存储函数的定义,也不需要两次类型转换,直接利用ASCII码的数值差一步计算即可:二进制值48对应字符'0'的ASCII码,49对应'1',直接用字节值减去'0'的ASCII码就能得到对应整型:

// 省略其他逻辑,直接替换返回部分代码
byte[] bytes = returnValue.Value as byte[];
return bytes[0] - '0';

额外优化:简化函数调用逻辑

你还可以换一种调用方式,不需要显式声明存储过程和返回参数,直接用SELECT语句调用存储函数,代码会更简洁:

private async Task<int> ExecuteIntScalarAsync(
  string functionName, 
  IEnumerable<DbParameter> parameters, 
  CancellationToken cancellationToken = default)
{
    using (MySqlConnection conn = new MySqlConnection(databaseConfiguration.GetConnectionString()))
    {
        await conn.OpenAsync(cancellationToken);
        // 拼接SELECT调用函数的SQL语句
        var paramPlaceholders = parameters?.Select(p => p.ParameterName) ?? Enumerable.Empty<string>();
        var cmdText = $"SELECT {functionName}({string.Join(",", paramPlaceholders)})";
        MySqlCommand cmd = new MySqlCommand(cmdText, conn);

        if (parameters != null)
            foreach (var parameter in parameters)
                cmd.Parameters.Add(parameter);
        
        logger.LogInformation($"Executing { functionName }");
        var result = await cmd.ExecuteScalarAsync(cancellationToken);
        return Convert.ToInt32(result);
    }
}

这种写法驱动会自动适配存储函数的返回类型,无需单独处理ReturnValue参数。

内容的提问来源于stack exchange,提问作者clemensoe

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 04:27:00