C# ';等待&x27;运算符只能在异步方法[MySQL connector]中使用
这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在StackOverflow上 第一个问题是关于MySqlClient EndOfStreamException的 第一个问题的答案让我将库从MySQL ADO.NET切换到MySQL连接器 自从从MySQL ADO.NET迁移到MySQL连接器后,我对一些MySQL关键字有一些问题。我也得到了这个问题的答案 现在程序正在运行,没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库 为了找到这个问题的解决方案,我尝试在下面的代码中将“wait”关键字添加到ExecuteNonQueryAsync()C# ';等待&x27;运算符只能在异步方法[MySQL connector]中使用,c#,mysql,mysql-connector,C#,Mysql,Mysql Connector,这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在StackOverflow上 第一个问题是关于MySqlClient EndOfStreamException的 第一个问题的答案让我将库从MySQL ADO.NET切换到MySQL连接器 自从从MySQL ADO.NET迁移到MySQL连接器后,我对一些MySQL关键字有一些问题。我也得到了这个问题的答案 现在程序正在运行,没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库 为了找到这个问题的解决方案,我尝试在下面的
private bool OpenConnection()
{
try
{
//connection.Open(); //line commented
**await connection.OpenAsync();**
Console.WriteLine("MySQL connected.");
return true;
}
catch (MySqlException ex)
{
}
public void Insert()
{
if (this.OpenConnection() == true)
{
using(var reader = new StreamReader(@"C:\Users\Admin\source\Bargstedt.csv"))
{
//List<string> listA = new List<string>();
while (!reader.EndOfStream)
{
***await reader.OpenAsync();***
var line = reader.ReadLine();
var values = line.Split(',');
string querynew = "INSERT INTO jobs"
+ "(nJobNumber,strClientReference,datPromisedDelivery)"
+ "VALUES (@jobNo, @strClientName, @strClientReference)";
var cmd = new MySqlCommand();
cmd.CommandText= querynew;
cmd.Parameters.AddWithValue("strClientName", "MySqlDbType.VarChar").Value =(values[1]);
cmd.Parameters.AddWithValue("strClientReference", "MySqlDbType.VarChar").Value = values[2];
***await cmd.ExecuteNonQueryAsync();***
// cmd.ExecuteNonQueryAsync(); //Line commented
}
}
this.CloseConnection();
}
}
private bool OpenConnection()
{
尝试
{
//connection.Open();//行已注释
**等待连接。OpenAsync()**
WriteLine(“MySQL连接”);
返回true;
}
捕获(MySqlException-ex)
{
}
公开作废插入()
{
if(this.OpenConnection()==true)
{
使用(var reader=newstreamreader(@“C:\Users\Admin\source\Bargstedt.csv”))
{
//List listA=新列表();
而(!reader.EndOfStream)
{
***等待reader.OpenAsync()***
var line=reader.ReadLine();
var值=行分割(',');
string querynew=“插入到作业中”
+(nJobNumber、strClientReference、dat promiseddelivery)
+“值(@jobNo、@strClientName、@strClientReference)”;
var cmd=new MySqlCommand();
cmd.CommandText=querynew;
cmd.Parameters.AddWithValue(“strClientName”、“MySqlDbType.VarChar”)。Value=(值[1]);
cmd.Parameters.AddWithValue(“strClientReference”、“MySqlDbType.VarChar”)。Value=Value[2];
***wait cmd.ExecuteNonQueryAsync()***
//cmd.ExecuteNonQueryAsync();//行注释
}
}
这个.CloseConnection();
}
}
在实现之前,我认为问题在于执行行,因为任何数据都不会写回数据库
这就是它说服我将waitopen和execute行包含到源代码中的原因,同样在本文中给出
不幸的是,在我使用的所有地方,wait关键字(在上述代码中突出显示)都会触发错误:
错误CS4032“等待”运算符只能在异步
方法:考虑用“AsiNC”修饰符标记此方法。
将其返回类型更改为“任务”
如何解决此问题?您认为数据库不更新的原因是什么
如果此'await'方法正确实现,它会被修复吗?异步代码更复杂。我建议您坚持使用(完全支持的)同步方法,直到数据库代码正常工作。因此,将
wait connection.OpenAsync();
更改回connection.Open();
,等待cmd.executenonquerysync();
到cmd.ExecuteNonQuery()
,等等
(在不使用await
语句的情况下,不要调用Async
方法,因为当主方法继续运行时,它将在后台继续执行,这可能会导致在两个单独的线程上同时使用相同的连接,从而导致错误。)
您给出的示例代码没有为@jobNo
添加参数值。这将导致异常,因为未定义参数
代码cmd.Parameters.AddWithValue(“strClientName”,“MySqlDbType.VarChar”).Value=(values[1])
错误地添加了一个带有字符串值“MySqlDbType.VarChar”
的参数,然后将其覆盖。编写cmd.Parameters.AddWithValue(“strClientName”,values[1]);
会更简单
一旦您的数据库代码正常工作,并且想要切换到异步,您可以在方法体中使用
wait
,然后使用async
关键字重新声明方法签名,例如,private async Task OpenConnection()
我已经更改了3个AddWithValue()正如你们提到的,数据库并没有更新@BradleyGrainger@simon你能用最新的代码更新你的问题吗?@Simon我在代码中看到的第一件事是conn.OpenAsync()
。正如我在回答中所写的,你不能这样做。阅读async/await,并始终await
异步方法,或者(我的建议)只调用同步方法。嘿,Bradley,当我尝试使用F11运行程序时,这很奇怪(进入)它实际上是有效的。数据库更新成功。但当我尝试使用F5完全运行时,会出现上述异常。我认为这是一个时间问题。有什么建议吗?@Bradley Grainger该错误消息表明在线路上接收到的二进制协议数据不是预期的。我不知道SSH隧道如何处理多个simultaneous connections;似乎可能是多个数据流混淆了?数据包捕获(应用程序和SSH隧道本地端之间的数据包)可能会说明这个问题。可能会发现阅读类似和的内容很有用