【问题标题】:MySqlCommand call function return typeMySqlCommand 调用函数返回类型
【发布时间】:2021-09-02 11:03:15
【问题描述】:

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

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);
    }
}

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

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

【问题讨论】:

    标签: c# mysql mariadb


    【解决方案1】:

    这是因为在您的函数中,您指定将函数的结果返回为binary(1)(即RETURNS binary(1))。您可以尝试将其更改为INT,例如:

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

    【讨论】:

    • 确实是这个问题。感谢您睁开双眼看它!老实说,我没想到它会接受签名和返回变量的不匹配,因为它对函数的声明通常非常严格。
    • 所以看起来那里的功能有一些灵活性。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-12
    相关资源
    最近更新 更多