'await'运算符只能在异步方法[mysql connector]中使用

aurhwmvo  于 2021-06-19  发布在  Mysql
关注(0)|答案(1)|浏览(375)

这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在stackoverflow上。
关于mysqlclient endofstreamexception的第一个问题。
第一个问题
第一个问题的答案让我将库从mysql ado.net切换到mysql connector。
从mysql ado.net迁移到mysql connector之后,我遇到了一些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();
                }

        }

在实现这个之前,我认为问题出在执行行上,因为任何数据都没有写回数据库。
这就是它说服我在源代码中加入waitopen和execute行的原因,同样在本例中给出。
不幸的是,在我使用的所有地方,await关键字(在上面的代码中突出显示)都触发了一个错误:
错误cs4032“await”运算符只能在异步方法中使用。请考虑使用“async”修饰符标记此方法,并将其返回类型更改为“task”。
如何解决这个问题?您认为数据库不更新的原因是什么?
如果这个'await'方法实现正确,它会被修复吗?

ljsrvy3e

ljsrvy3e1#

异步代码更复杂。我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码正常工作。所以改变吧 await connection.OpenAsync(); 回到 connection.Open(); , await cmd.ExecuteNonQueryAsync();cmd.ExecuteNonQuery() 等等。
(不要打电话给 Async 方法而不使用 await 语句,因为它将在主方法继续运行时在后台继续执行,这可能会导致同一连接在两个单独的线程上同时使用,从而导致错误。)
您给出的示例代码没有为添加参数值 @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() .

相关问题