首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MySqlDataReader.GetStream()抛出IndexOutOfRangeException

MySqlDataReader.GetStream()抛出IndexOutOfRangeException
EN

Stack Overflow用户
提问于 2020-07-11 12:08:21
回答 2查看 290关注 0票数 0

因此,我将MySql.Data包用于我的.NET核心项目,并将密码散列和盐类(类型为byte[])作为varbinary()存储到数据库中。当从用户中选择密码哈希和salt时,我需要一种将结果转换回字节数组的方法。给定此示例代码

代码语言:javascript
复制
Stream passwordHashStream = dbDataReader.GetStream(0);
byte[] passwordHash;
                        
using (MemoryStream memoryStream = new MemoryStream())
{
    await passwordHashStream.CopyToAsync(memoryStream);
    passwordHash = memoryStream.ToArray();
}

第一行将引发此异常。

MySql.Data.MySqlClient.Interceptors.ExceptionInterceptor.Throw(Exception :数据索引必须是字段中的有效索引,如MySql.Data.MySqlClient.MySqlConnection.Throw(Exception异常)、MySql.Data.MySqlClient.MySqlDataReader.Throw(Exception ex)、MySql.Data.MySqlClient.MySqlDataReader.GetBytes(Int32 i、Int64 fieldOffset、Byte[]缓冲区、Int32缓冲器,( System.Data.Common.DbDataReader.GetStream(Int32序数处的Int32长度)在/.../Infrastructure/Persistence/Repositories/UsersRepository.cs:line 60中的Infrastructure.Persistence.Repositories.UsersRepository.<>c.d.MoveNext()处

尽管读取器包含正确的数据库结果,如下所示(密码为32字节,散列为16字节)

2018年报告了这一错误。

https://bugs.mysql.com/bug.php?id=93374

并且已经确认了身份。关于如何解决这个问题,有什么好的解决办法/解决办法吗?我不想使用GetBytes方法,因为它要求我传递字节数组的长度,并且我希望与它保持独立。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-07-11 17:24:58

卸载MySql.Data并用MySqlConnector替换它。

(披露:我是你发现的MySql窃听器的记者,也是MySqlConnector的主要撰稿人。)

除了修复这个问题还有很多其他的虫子之外,MySqlConnector还增加了真正的异步I/O支持和性能改进。

我不想使用GetBytes方法,因为它要求我传递字节数组的长度,并且我希望与它保持独立。

如果您不想切换库,GetBytes的一个鲜为人知的特性(由MySql.Data和MySqlConnector支持)是,传入null缓冲区返回所需的长度,因此不需要对其进行硬编码:

代码语言:javascript
复制
// 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);
票数 2
EN

Stack Overflow用户

发布于 2020-07-11 12:33:07

代码语言:javascript
复制
public static async Task<MemoryStream> ToMemoryStream(this Stream stream)
    {
      var memStream = stream as MemoryStream;
      if (memStream == null)
      {
        memStream = new MemoryStream();
        await stream.CopyToAsync(memStream);
      }
      return memStream;
    }

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62848963

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档