2011-01-04 3 views
0
public static DataTable GetDataTable(SqlCommand sqlCmd) 
    { 
     DataTable tblMyTable = new DataTable(); 
     DataSet myDataSet = new DataSet(); 

     try 
     { 
      //1. Create connection 
      mSqlConnection = new SqlConnection(mStrConnection); 

      //2. Open connection 
      mSqlConnection.Open(); 

      mSqlCommand = new SqlCommand(); 
      mSqlCommand = sqlCmd; 

      //3. Assign Connection 
      mSqlCommand.Connection = mSqlConnection; 

      //4. Create/Set DataAdapter 
      mSqlDataAdapter = new SqlDataAdapter(); 
      mSqlDataAdapter.SelectCommand = mSqlCommand; 

      //5. Populate DataSet  
      mSqlDataAdapter.Fill(myDataSet, "DataSet"); 

      tblMyTable = myDataSet.Tables[0]; 
     } 
     catch (Exception ex) 
     { 

     } 
     finally 
     { 
      //6. Clear objects 
      if ((mSqlDataAdapter != null)) 
      { 
       mSqlDataAdapter.Dispose(); 
      } 

      if ((mSqlCommand != null)) 
      { 
       mSqlCommand.Dispose(); 
      } 

      if ((mSqlConnection != null)) 
      { 
       mSqlConnection.Close(); 
       mSqlConnection.Dispose(); 

      } 
     } 

     //7. Return DataSet 
     return tblMyTable; 
    } 

ではなくのDataTableのDataReaderを使用する方がよいでしょうか?

注:GridViewの2つの列はハイパーリンクされています。

答えて

1

あなたがDataTableを使用する場合は、あなたがすべき:常に

  • 適切な処分を確保するためにusing(..) { ... }ブロックにあなたのSqlConnectionSqlCommandオブジェクトを置くように遅く、あなたのSqlConnectionを開きますできるだけ早くもう一度閉じる

  • SqlDataAdapter、あなたも明示的にオープン/あなたの接続を終了する必要はありません - データアダプタあなたのためにこれを行います

  • はあなたのDataSetのように、不要な追加のオブジェクトを使用していない - ちょうど直接DataTableを埋めます!

だからあなたのコードは次のようになります。他のrespondantsのいくつかのように

public static DataTable GetDataTable(SqlCommand sqlCmd) 
{ 
    DataTable tblMyTable = new DataTable(); 

    try 
    { 
     // Create connection 
     using(SqlConnection mSqlConnection = new SqlConnection(mStrConnection)) 
     { 
      // Assign Connection 
      sqlCmd.Connection = mSqlConnection; 

      // Create/Set DataAdapter 
      using(SqlDataAdapter mSqlDataAdapter = new SqlDataAdapter(sqlCmd)) 
      { 
       mSqlDataAdapter.Fill(tblMyTable); 
      } 
     } 
    } 
    catch (Exception ex) 
    { 
     // handle exception 
    } 

    // Return DataTable 
    return tblMyTable; 
} 

は、すでに言及している:

  • は20,000行を返さない.....あなたのグリッドが示すことができるだけ多くのものを返してください。時間、空間、処理能力の無駄です。

  • a LSO:私は特にSqlCommandを渡すのアイデア好きではない - 私は、このメソッドを記述した場合、私は文字列としてSQLクエリに渡すだけ、このメソッド内

SqlCommandを作成したいです最終的な勧告:この時代にはに行/列ベースのプログラミングモデルからを移動しようとしました。それは20世紀のsooooです。間違いなくORMのオブジェクトリレーショナルマッパーを調べる必要がありますあなたのデータベースの行/列をプログラミングにやさしいオブジェクトに変換し、それらをプログラムに使用します。

NHibernate、Linq-to-SQL、Entity Framework v4などをチェックしてください...まだDataTableDataRowで混乱しなければならないのは非常に低レベルであり、それほど生産的ではありません!

+0

「使用」ポイントは学問的なものです。彼はすでに、finallyブロックにオブジェクトを正しく配置しています。 – Jamiec

+0

@Jamiec:いいえ、 'using'ブロックを使うのは、一般的に受け入れられているベストプラクティスです。それに慣れてください。もうfinallyブロックについて心配する必要はありません。 'ブロック.....) –

+0

ああ私は確かにそれを行う、そのちょうど私はそれがすでにそれらのオブジェクトを処分することを知っていたとして見て強調するために奇妙なものだと思った。 – Jamiec

0

あなたのスニペットはあまりにも悪くはありませんが、いくつかのメモがあります。

1)発生した例外を無視していますが、これはここの例にすぎませんが、そうでない場合は非常に悪いです。エラーを記録する必要があります。

2)恐ろしい形のハンガリー語表記を使用しています。この習慣から抜け出して、現在または将来使用できる他のC#開発者にとって有益です。

3)20Kレコードをユーザーに表示することは狂気です。人間はその多くの記録を流さないので、レンダリングが遅く、ほとんど役に立たないでしょう。検索、フィルタ、またはその両方の組み合わせを使用して、よりスマートなUIを提供します。

DataAdapter/DataReaderの質問については、とにかくデータアダプターがフードの下でデータリーダーを使用しているので、実際には違いはありません。より良い質問は、「レコードを表すためにデータセットまたは独自のカスタムオブジェクトを使用する必要がありますか?データセットが提供する余分な機能(各レコードの状態の維持など)が必要な場合は、データセットを使用する必要があります。レコードがちょうどグリッド上に表示されるように取り出された場合、私はおそらくそうではないでしょう。

0

なぜデータベースから20,000以上のレコードが返されたのですか?私はあなたのGridViewのページサイズに従ってレコードを取得する必要がありますと思う。

たとえば、GridViewのページサイズが10の場合、dbから10レコードしか取得できません。

0

1 - データがユーザー固有ではなく、数時間静的であっても何らかの静的なものであれば(ここのケースだと思いますが)、データをフェッチしてキャッシュに保存して表示できますこのキャッシュされたデータをこのようにユーザーに提供することで、各ユーザーの要求ごとにデータテーブルを再設定することを減らすことができます。

2上記の点は、チャンク内のデータを読み込み、ページングを使用して20000+の行を見に行くことがないため、返されたデータを減らすためにページングを使用すると、アプリケーションが応答しますもっと早く。

上記の両方の点でキャッシュを使用すると、アプリケーションのputによってインクリメントすることができます。

関連する問題