'await' 运算符只能在异步方法中使用 [MySQL 连接器]
The 'await' operator can only be used within an async method [MySQL connector]
这个问题与我过去几天在 Whosebug 上发布的两个问题有关。
关于 MySqlClient EndOfStreamException 的第一个问题。
第一个问题的答案让我将库从 MySQL ADO.NET 切换到 MySQL 连接器。
自从从 MySQL ADO.NET 转移到 MySQL 连接器后,我在某些 MySQL 关键字方面遇到了一些问题。我也得到了这个问题的答案。
现在程序 运行 没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库。
为了找到解决此问题的方法,我尝试将 "await" 关键字添加到 ExecuteNonQueryAsync(),如下代码所示。
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();
}
}
在实现这个之前,我认为问题出在执行行上,因为任何数据都没有写回数据库。
这就是它说服我加入 await open and execute lines to the source code likely given in this example.
的原因
不幸的是,在我使用 await 关键字的所有地方(在上面的代码中突出显示)触发错误:
Error CS4032 The 'await' operator can only be used within an async
method. Consider marking this method with the 'async' modifier and
changing its return type to 'Task'.
如何解决这个问题,您认为数据库不更新的原因是什么?
如果这个'await'方法正确执行,是否可以修复?
异步代码比较复杂。我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码开始工作。所以将 await connection.OpenAsync();
改回 connection.Open();
,将 await cmd.ExecuteNonQueryAsync();
改回 cmd.ExecuteNonQuery()
,等等
(不要在不使用 await
语句的情况下调用 Async
方法,因为它会在后台继续执行,而您的主要方法保持 运行,这可能会导致在两个单独的线程上同时使用相同的连接,导致错误。)
您提供的示例代码没有为 @jobNo
添加参数值。这将导致异常,因为未定义参数。
代码 cmd.Parameters.AddWithValue("strClientName", "MySqlDbType.VarChar").Value =(values[1])
错误地添加了一个带有文字字符串值 "MySqlDbType.VarChar"
的参数,然后覆盖了它。写成 cmd.Parameters.AddWithValue("strClientName", values[1]);
.
会更直接
一旦您的数据库代码开始工作,并且想要切换到异步,您可以在方法主体中使用 await
,然后使用 async
关键字重新声明方法签名,例如,private async Task<bool> OpenConnection()
.
这个问题与我过去几天在 Whosebug 上发布的两个问题有关。
关于 MySqlClient EndOfStreamException 的第一个问题。
第一个问题的答案让我将库从 MySQL ADO.NET 切换到 MySQL 连接器。
自从从 MySQL ADO.NET 转移到 MySQL 连接器后,我在某些 MySQL 关键字方面遇到了一些问题。我也得到了这个问题的答案。
现在程序 运行 没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库。
为了找到解决此问题的方法,我尝试将 "await" 关键字添加到 ExecuteNonQueryAsync(),如下代码所示。
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();
}
}
在实现这个之前,我认为问题出在执行行上,因为任何数据都没有写回数据库。
这就是它说服我加入 await open and execute lines to the source code likely given in this example.
的原因不幸的是,在我使用 await 关键字的所有地方(在上面的代码中突出显示)触发错误:
Error CS4032 The 'await' operator can only be used within an async method. Consider marking this method with the 'async' modifier and changing its return type to 'Task'.
如何解决这个问题,您认为数据库不更新的原因是什么?
如果这个'await'方法正确执行,是否可以修复?
异步代码比较复杂。我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码开始工作。所以将 await connection.OpenAsync();
改回 connection.Open();
,将 await cmd.ExecuteNonQueryAsync();
改回 cmd.ExecuteNonQuery()
,等等
(不要在不使用 await
语句的情况下调用 Async
方法,因为它会在后台继续执行,而您的主要方法保持 运行,这可能会导致在两个单独的线程上同时使用相同的连接,导致错误。)
您提供的示例代码没有为 @jobNo
添加参数值。这将导致异常,因为未定义参数。
代码 cmd.Parameters.AddWithValue("strClientName", "MySqlDbType.VarChar").Value =(values[1])
错误地添加了一个带有文字字符串值 "MySqlDbType.VarChar"
的参数,然后覆盖了它。写成 cmd.Parameters.AddWithValue("strClientName", values[1]);
.
一旦您的数据库代码开始工作,并且想要切换到异步,您可以在方法主体中使用 await
,然后使用 async
关键字重新声明方法签名,例如,private async Task<bool> OpenConnection()
.