Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/65.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# ';等待&x27;运算符只能在异步方法[MySQL connector]中使用_C#_Mysql_Mysql Connector - Fatal编程技术网

C# ';等待&x27;运算符只能在异步方法[MySQL connector]中使用

C# ';等待&x27;运算符只能在异步方法[MySQL connector]中使用,c#,mysql,mysql-connector,C#,Mysql,Mysql Connector,这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在StackOverflow上 第一个问题是关于MySqlClient EndOfStreamException的 第一个问题的答案让我将库从MySQL ADO.NET切换到MySQL连接器 自从从MySQL ADO.NET迁移到MySQL连接器后,我对一些MySQL关键字有一些问题。我也得到了这个问题的答案 现在程序正在运行,没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库 为了找到这个问题的解决方案,我尝试在下面的

这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在StackOverflow上

第一个问题是关于MySqlClient EndOfStreamException的

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

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

现在程序正在运行,没有任何错误。但不幸的是,有一个陷阱,因为数据并没有写入数据库

为了找到这个问题的解决方案,我尝试在下面的代码中将“wait”关键字添加到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();
                }



        }
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隧道本地端之间的数据包)可能会说明这个问题。可能会发现阅读类似和的内容很有用