gpt4 book ai didi

c# - 使用 ExecuteReaderAsync 时无法将类型 DbDataReader 隐式转换为 MySqlDataReader

转载 作者:行者123 更新时间:2023-11-30 23:49:14 25 4
gpt4 key购买 nike

我有以下函数,它允许我传入一个对象并用返回数据(如果有)填充该对象。

我修改了该函数,使其可以异步调用。

public static async Task<MySqlDataReader> MySQLReturnReader(string sName, List<MySqlParameter> oParameters, Action<MySqlDataReader> fn)
{
using (MySqlConnection oConn = new MySqlConnection(MasterConn))
{
await oConn.OpenAsync();

using (MySqlCommand oMySqlCommand = new MySqlCommand(sName, oConn))
{
oMySqlCommand.CommandType = CommandType.StoredProcedure;

if (oParameters != null)
{
foreach (MySqlParameter oPar in oParameters)
{
oMySqlCommand.Parameters.Add(oPar);
}
}

oMySqlCommand.Connection.Open();

using (MySqlDataReader oReader = oMySqlCommand.ExecuteReaderAsync())
{
fn(oReader);
}

}
}
return;
}

我的类对象是这样的;

public class MyClass
{
public int Id {get;set;}
public string Name {get;set;}
...
}

函数可以这样调用

 List<MyClass> oMyClassList = new List<MyClass>();
List<MySqlParameter> oParams = new List<MySqlParameter>();

List<int> Ids = new List<int>(500);
Ids.Add(1);
Ids.Add(2);
...
Ids.Add(499);

foreach(int Id in Ids)
{
MySQLReturnReader("SPCheck", oParams, oRes =>
{
while (oRes.Read())
{
MyClass oMyClass = new MyClass();
oMyClass.Id = Convert.ToInt32(oRes["Id"]);
oMyClass.Name = oRes["Name"].ToString();
}

oMyClassList.Add(oMyClass);
}
);


}

问题是我收到“无法将类型‘System.Threading.Tasks.Task’隐式转换为‘MySql.Data.MySqlClient.MySqlDataReader’”的编译错误。我哪里出错了?

我想以这种方式使用 ExecuteReaderAsync,因为调用的存储过程非常复杂并且更愿意并行运行请求。

最佳答案

在您的代码中,您有:

using (MySqlDataReader oReader = oMySqlCommand.ExecuteReaderAsync())

编译错误Cannot implicitly convert type 'System.Threading.Tasks.Task' to 'MySql.Data.MySqlClient.MySqlDataReader' 意味着你需要使用await 用于“解包”ExecuteReaderAsync 返回的任务的关键字:

using (MySqlDataReader oReader = await oMySqlCommand.ExecuteReaderAsync())

但是请注意,如果您使用的是官方 MySql.Data 包,则此调用实际上不会异步执行。 MySql.Data 连接器中的Async 方法不是异步的;它们阻塞网络 I/O,并且仅在数据库操作完成时返回。 (有关更详细的讨论,请参阅 this question and its top answer。)MySQL bug #70111在 MySQL 连接器中报告此问题。

要获得真正的异步数据库操作,您必须等到错误被修复,或者切换到不同的连接器。我一直在开发一个新的、完全异步的连接器,它应该是 MySql.Data 的直接替代品;要试用,请安装 MySqlConnector from NuGet ;它的source is at GitHub .

关于c# - 使用 ExecuteReaderAsync 时无法将类型 DbDataReader 隐式转换为 MySqlDataReader,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20053227/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com