c# - MySqlDataReader.GetStream() 抛出 IndexOutOfRangeException
问题描述
因此,我将 MySql.Data 包用于我的 .NET Core 项目,并将密码哈希和盐(类型byte[]
)存储varbinary()
到数据库中。从用户那里选择密码哈希和盐时,我需要一种将结果转换回字节数组的方法。鉴于此示例代码
Stream passwordHashStream = dbDataReader.GetStream(0);
byte[] passwordHash;
using (MemoryStream memoryStream = new MemoryStream())
{
await passwordHashStream.CopyToAsync(memoryStream);
passwordHash = memoryStream.ToArray();
}
第一行会抛出这个异常
System.IndexOutOfRangeException:数据索引必须是 MySql.Data.MySqlClient.MySqlConnection.Throw(Exception ex) 在 MySql.Data.MySqlClient.Interceptors.ExceptionInterceptor.Throw(Exception exception) 在 MySql.Data.MySqlClient 的字段中的有效索引.MySqlDataReader.Throw(Exception ex) at MySql.Data.MySqlClient.MySqlDataReader.GetBytes(Int32 i, Int64 fieldOffset, Byte[] buffer, Int32 bufferoffset, Int32 length) at System.Data.Common.DbDataReader.GetStream(Int32 ordinal)在 Infrastructure.Persistence.Repositories.UsersRepository.<>c.<b__1_0>d.MoveNext() 在 /.../Infrastructure/Persistence/Repositories/UsersRepository.cs:line 60
尽管阅读器包含正确的数据库结果,如下所示(密码为 32 字节,哈希为 16 字节)
2018年报错
https://bugs.mysql.com/bug.php?id=93374
并具有经过验证的状态。是否有任何好的解决方案/解决方法来解决它?我不想使用该GetBytes
方法,因为它需要我传入字节数组的长度,并且我想保持独立。
解决方案
卸载 MySql.Data 并将其替换为MySqlConnector。
(披露:我是您发现的 MySql 错误的报告者,也是MySqlConnector的主要贡献者。)
除了修复该问题和许多其他错误之外,MySqlConnector 还添加了真正的异步 I/O 支持和性能改进。
我不想使用该
GetBytes
方法,因为它需要我传入字节数组的长度,并且我想保持独立。
如果您不想切换库,GetBytes
(MySql.Data 和 MySqlConnector 都支持)的一个鲜为人知的功能是传入null
缓冲区返回所需的长度,因此您不需要对其进行硬编码:
// get the length of the column and allocate a buffer
var length = dbDataReader.GetBytes(0, 0, null, 0, 0);
var passwordHash = new byte[length];
// fill the buffer from the column
dbDataReader.GetBytes(0, 0, passwordHash, 0, passwordHash.Length);
推荐阅读
- google-cloud-storage - StreamingFileSink + GCS
- compression - 将 6 位整数打包成 1 个 64 位整数
- node.js - 是否可以从 docker 映像创建可执行文件?
- telegram-bot - 是否可以以编程方式批准用户仅在 Telegram 上发布到频道?
- android - 适合安卓词汇游戏的数据库?
- json - 使用 python 将 SQL Server 数据库中的数据转换为 JSON 格式
- swift - 不知道为什么在将 UILabel 设置为隐藏时出现错误 | 迅速
- html - 这个 form_tag 元素总是显示语法错误是有原因的吗?
- windows - 如何将“list.txt”合并到 cmd
- excel - 根据单元格长度设置单元格值