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

