2017-08-08 37 views
0

我正在制作一个C#应用程序来重新存储目录中存储的许多.bak文件。它现在工作正常,但我有一个问题,我似乎无法解决,并希望你的帮助。 ExecuteNonQuery需要一段时间来恢复一个.bak文件,并且我想每次ExecuteNonQuery完成时都用消息更新文本框。在执行方法之后更新文本框Winforms

我试着拨打ExecuteNonQueryAsync,但我得到这个消息:

连接不负责MultipleActiveResultSets采取

我的问题是:我如何更新文本框每次的ExecuteNonQuery完成?

这里是我的代码,请指教:

foreach (FileInfo file in Files) 
     { 
      string DbNamequery = "RESTORE FILELISTONLY FROM DISK = N'" + FolderBrowser.SelectedPath + @"\" + file.Name + "'" ; 

      sqlform.ConSQL.PrepareQuery(DbNamequery); 

      try 
      { 
       string DbName = sqlform.ConSQL.GetDataBaseName(); 
       string RestoreQuery = "RESTORE DATABASE [" + file.Name + "] FILE = N'" + DbName + "' FROM DISK = N'" + FolderBrowser.SelectedPath + @"\" + file.Name; 
        RestoreQuery += "' WITH FILE = 1,MOVE N'" + DbName + @"' TO N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\" + file.Name + ".mdf'"; 
        RestoreQuery += ",MOVE N'" + DbName + @"_log' TO N'C:\Program Files\Microsoft SQL Server\MSSQL11.MSSQLSERVER\MSSQL\DATA\" + file.Name + "_0.ldf',"; 
        RestoreQuery += "NOUNLOAD, STATS = 10"; 

       sqlform.ConSQL.PrepareQuery(RestoreQuery); 

       sqlform.ConSQL.ExecuteQuery(); 

       ReportTextBox.Text += "Data Base : " + DbName + " Has been Restored With this Name :" + file.Name + " Successfully \r\n"; 

      } 
      catch (Exception ex) 
      { 
       ReportTextBox.Text += "Couldn't Resotre File " + file.Name + " Because of The following : \r\n" + ex.Message; 
      } 
     } 

定义为的executeQuery():

public async void ExecuteQuery() 
    { 
     int x = await cmd.ExecuteNonQueryAsync(); 
    } 

当我执行查询同步它工作正常,但ReportTextbox没有得到更新,直到该循环已结束。

而且这段代码被包装在一个点击按钮事件提前

感谢

回答

0

首先你不应该有async void方法,而返回一个Task

public async Task<int> ExecuteQuery() 
    { 
     int x = await cmd.ExecuteNonQueryAsync(); 
     return x; 
    } 

在调用代码,await方法调用和更新文本框,希望只有在RESTORE操作成功时才​​需要更新文本框文本

int result = await sqlform.ConSQL.ExecuteQuery(); 
if(result > 0) 
ReportTextBox.Text += "Data Base : " + DbName + " Has been Restored With this Name :" + file.Name + " Successfully \r\n"; 
+0

哦,我看到我从来没有想过返回任务,所以每Asyncronos了Methode高度重视和返回的东西是任务类型? ,现在它正在更新我的文本框,但即使查询执行得很好结果> 0测试总是失败?我认为我的try catch足以检测RESTORE操作是否成功,你不这么认为吗?无论如何谢谢你的洞察力,真的帮助人 –