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

MariaDB ColumnStore存储过程调用报错:预期读4字节头仅获0字节

解决C#调用MariaDB ColumnStore存储过程不返回受影响行数的报错问题

针对你遇到的MariaDB ColumnStore存储过程不返回受影响行数,导致EF Core的ExecuteSqlRaw报错的问题,有两种可行的解决方法:

方法一:直接使用DbCommand执行(无需修改存储过程)

绕开EF Core的ExecuteSqlRaw,直接通过底层的DbCommand执行存储过程,避免等待预期的受影响行数返回:

using (var connection = dbContext.Database.GetDbConnection())
{
    await connection.OpenAsync();
    using (var command = connection.CreateCommand())
    {
        command.CommandText = "UpdateDimDateEntity";
        command.CommandType = System.Data.CommandType.StoredProcedure;

        // 添加存储过程所需参数
        command.Parameters.AddWithValue("@DimDateKey", yourDimDateKeyValue);
        command.Parameters.AddWithValue("@FullDate", yourFullDateValue);
        command.Parameters.AddWithValue("@DayName", yourDayNameValue);
        command.Parameters.AddWithValue("@DayOfWeek", yourDayOfWeekValue);

        // 执行命令,不要求返回受影响行数
        await command.ExecuteNonQueryAsync();
    }
}

这种方式直接操作数据库连接和命令,ExecuteNonQueryAsync不会强制校验返回的受影响行数,适配ColumnStore存储过程的特性。

方法二:修改存储过程,手动返回一个值(如果允许修改存储过程)

如果可以调整存储过程代码,在末尾添加一个dummy返回值,让ExecuteSqlRaw能拿到预期的int类型结果:

修改后的存储过程:

CREATE DEFINER=`user11`@`%` PROCEDURE `UpdateDimDateEntity`(IN DimDateKey INT,
     IN FullDate DATE,
     IN DayName NVARCHAR(50),
     IN DayOfWeek SMALLINT)
BEGIN
 UPDATE DimDate
    SET
        FullDate = FullDate,
        DayName = DayName,
        DayOfWeek = DayOfWeek       
    WHERE DimDate.DimDateKey = DimDateKey;
 -- 添加一行返回值,满足EF Core的int返回类型要求
 SELECT 0;
END

之后你可以继续使用原来的ExecuteSqlRaw调用,此时存储过程会返回一个int值,不会再触发报错。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 22:42:45