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
相关产品推荐
相关产品推荐

