2017-07-14 18 views
0

私はWebAPIプロジェクトで使用されるすべてのSQLベースクラスにasyncの実装を追加しています。私はまだTAPのパラダイムを新しくしているので、私はまだ学んでいます。C#DataTableを非同期で実装する

他の投稿のおかげで、Task.Run()経由でスレッドを生成すると、ASP.NETコンテキストでパフォーマンス上の利点はありません。だから私は私の実装にもっと注意しています。

私はQueryExecutorメソッドを以下の非同期実装に変更しました。しかし、どのような方法をロードする最良の方法を把握することはできませんDataTableです。私は理想的にはreader.ReadAsync()を使用してDataTableにデータを追加したいと思っていますが、.NET 4.5フレームワークで利用できるものはないようです。

私はDataTable.LoadAsync(DbDataReader reader)のような独自の拡張メソッドを書く価値があると思いますか?私は管理された.Netコードほど愚かではないので、それが助けられたらいいなと思う。

あなたの意見を聞かせてください。

private async Task<DataTable> ExecuteQueryInternalAsync(string commandText, CommandType commandType, SqlConnection sqlConnection, SqlTransaction transaction, params SqlParameter[] parameters) 
{ 
    using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection) { CommandType = commandType, CommandTimeout = this.config.MainConnectionTimeoutInSeconds }) 
    { 
     if (transaction != null) 
      cmd.Transaction = transaction; 

     if (parameters != null) 
     { 
      foreach (var parameter in parameters) 
      { 
       if (parameter != null) 
       { 
        if (parameter.Value == null) 
         parameter.Value = DBNull.Value; 

        cmd.Parameters.Add(parameter); 
       } 
      } 
     } 

     if (sqlConnection.State == ConnectionState.Closed) 
      await sqlConnection.OpenAsync(); 

     using (var reader = await cmd.ExecuteReaderAsync()) 
     { 
      //Want to use: reader.ReadAsync() 
      var tb = new DataTable(); 
      tb.Load(reader); 
      return tb; 
     } 
    } 
} 

おかげで、 ポール

+0

:サンプルコードは管理されています.Netコード –

+0

一般に、非同期コードはEntit y 'DataTable'ではなくフレームワーククエリ。 –

+0

私はEF 6を使用します。しかし、SPを実行して結果をDataTableとして取得する必要がある場合があります。 – Sal

答えて

0

あなたが拡張メソッドをしたい場合は、コマンドに直接書き込むことができます

public static class extensions 
    { 
     public async static Task<DataTable> ExecuteAndCreateDataTableAsync(this SqlCommand cmd) 
     { 
      using (var reader = await cmd.ExecuteReaderAsync().ConfigureAwait(false)) 
      { 
       var dataTable = reader.CreateTableSchema(); 
       while (await reader.ReadAsync().ConfigureAwait(false)) 
       { 
        var dataRow = dataTable.NewRow(); 
        for (int i = 0; i < dataTable.Columns.Count; i++) 
        { 
         dataRow[i] = reader[i]; 
        } 
        dataTable.Rows.Add(dataRow); 
       } 
       return dataTable; 

      } 
     } 
     public static void LoadParams(this SqlCommand cmd, params SqlParameter[] parameters) 
     { 
      if (parameters != null) 
      { 
       foreach (var parameter in parameters) 
       { 
        if (parameter != null) 
        { 
         if (parameter.Value == null) 
          parameter.Value = DBNull.Value; 

         cmd.Parameters.Add(parameter); 
        } 
       } 
      } 
     } 


     private static DataTable CreateTableSchema(this SqlDataReader reader) 
     { 
      DataTable schema = reader.GetSchemaTable(); 
      DataTable dataTable = new DataTable(); 
      if (schema != null) 
      { 
       foreach (DataRow drow in schema.Rows) 
       { 
        string columnName = System.Convert.ToString(drow["ColumnName"]); 
        DataColumn column = new DataColumn(columnName, (Type)(drow["DataType"])); 
        dataTable.Columns.Add(column); 
       } 
      } 
      return dataTable; 
     } 
    } 

とあなたのmedhod:ちょうどsidenode

private async Task<DataTable> ExecuteQueryInternalAsync(string commandText, CommandType commandType, SqlConnection sqlConnection, SqlTransaction transaction, params SqlParameter[] parameters) 
     { 
      using (SqlCommand cmd = new SqlCommand(commandText, sqlConnection) { CommandType = commandType, CommandTimeout = this.config.MainConnectionTimeoutInSeconds }) 
      { 
       if (transaction != null) 
        cmd.Transaction = transaction; 

       cmd.LoadParams(parameters); 

       if (sqlConnection.State == ConnectionState.Closed) 
        await sqlConnection.OpenAsync(); 

       var datatable = await cmd.ExecuteAndCreateDataTableAsync(); 
       return datatable; 
      } 
     } 
+0

私の質問の一部は、これを行う価値があるのですか? DataTableに同期してデータを読み込むのではなく、ReadAsync()を使用する価値はありますか? – Sal

+0

これは単なる実装です。私はそれがExecuteReaderAsyncの後に不要だと思う – levent

関連する問題