“ await”运算符只能在异步方法中使用[MySQL连接器]

时间:2018-09-20 05:06:15

标签: c# mysql mysql-connector

这个问题与我最近的2个问题相关,这些问题最近几天发布在StackOverflow上。

关于MySqlClient EndOfStreamException的第一个问题。

1st Question

第一个问题的答案使我开始将库从MySQL ADO.NET切换到MySQL连接器。

自从MySQL ADO.NET迁移到MySQL连接器以来,一些MySQL关键字出现了一些问题。我也得到了这个问题的答案。

2nd Question

现在程序正在运行,没有任何错误。但是不幸的是,由于没有将数据写入数据库,因此存在问题。

为了找到解决此问题的方法,我尝试从以下代码开始向ExecuteNonQueryAsync()添加“ await” 关键字。

 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 打开并执行此example中给出的源代码行的原因。

不幸的是,在我使用过 await 关键字的所有地方(在上面的代码中突出显示)都触发了错误:

  

错误CS4032'await'运算符只能在异步中使用   方法。考虑使用“异步”修饰符标记此方法,然后   将其返回类型更改为“任务”。

如何解决此问题,您认为数据库未更新的原因是什么?

是否可以正确实施此'await'方法?

1 个答案:

答案 0 :(得分:1)

异步代码更加复杂。我建议您坚持使用(完全支持的)同步方法,直到您的数据库代码正常工作为止。因此,将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关键字重新声明方法签名,例如{{1 }}。