这个问题与我最近的2个问题相关,这些问题最近几天发布在StackOverflow上。
关于MySqlClient EndOfStreamException的第一个问题。
第一个问题的答案使我开始将库从MySQL ADO.NET切换到MySQL连接器。
自从MySQL ADO.NET迁移到MySQL连接器以来,一些MySQL关键字出现了一些问题。我也得到了这个问题的答案。
现在程序正在运行,没有任何错误。但是不幸的是,由于没有将数据写入数据库,因此存在问题。
为了找到解决此问题的方法,我尝试从以下代码开始向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'方法?
答案 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 }}。