这个问题与我之前的两个问题有关,这两个问题在最近几天已经发布在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'方法实现正确,它会被修复吗?
1条答案
按热度按时间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()
.