Кто-нибудь знает, как выполнить асинхронное создание таблиц с помощью Microsoft.SqlServer.Management.Smo.Table? - PullRequest
0 голосов
/ 06 августа 2020

В настоящее время у меня проблема с загрузчиком данных при асинхронном создании Microsoft.SqlServer.Management.Smo.Table. Примечание. Я получил свой SmoTable из TableView и IDisposable.

  private async Task Generate()  
  {
       await Task.Run(()=>
       {
          MSSMSDatabase db = CreateDB(txtDBname.Text);
          List<string> tableNames = GetTableNameList();
          for(string tableName in tableNames)
          {
              using(SmoTable tbl = new Table(db, tableName)) // <=== after a few loops, the error occurs within here.
              {
                  foreach(var col in columnList)
                  {
                      tbl.AddColumns(col); 
                  }
                  tbl.Create();          
              }
          }

       });
   }

Microsoft.SqlServer.Management.Smo.FailedOperationException: InvalidOperationException: уже существует открытый DataReader, связанный с этим подключением, которое необходимо сначала закрыть.

Я попытался реализовать IDisposable в своем классе SmoTable, который я унаследовал от класса TableView, но по-прежнему имел ту же ошибку.

Заранее спасибо.

1 Ответ

0 голосов
/ 07 августа 2020

Я провел метод проб и ошибок и обнаружил, что вам нужно создавать новое соединение для каждого создания таблицы, чтобы создать для нее отдельный носитель данных. Итак, если вы включите экземпляр Server в foreach l oop, он создаст новое соединение и, следовательно, новый носитель данных.

for(string tableName in tableNames)
{
    using(SmoTable tbl = new Table(db, tableName)) // <=== after a few loops, the error occurs within here.
    {
        foreach(var col in columnList)
        {
            _server = GetSQLServer(); // <=== this is basically Server server = new Server(); return server; kind of method.
            db = _server.Databases[_databaseName];
            tbl.AddColumns(col); 
        }
        tbl.Create();          
    }
}
...