2011-01-04 7 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; 
    } 
  • Ich verwende den obigen Code Datensätze aus der Datenbank zurückzukehren.Wird mein DataTable-Snippet korrekt geschrieben?

  • Das obige Snippet würde in Web Anwendung laufen, die voraussichtlich um 5000 Besucher täglich haben.

  • Die zurückgegebenen Datensätze 20.000 oder über erreichen.

  • Die zurückgegebenen Datensätze werden (schreibgeschützt) in ausgelagertem GridView angezeigt.

Wäre es besser, Datareader verwenden anstelle von Datatable?

HINWEIS: zwei Spalten in der Gridview sind verlinkt.

Antwort

1

Wenn Sie eine DataTable verwenden, dann sollten Sie:

  • immer setzen Sie Ihre SqlConnection und SqlCommand Objekte in using(..) { ... } Blöcke ordnungsgemäße Entsorgung

  • öffnen Sie Ihre SqlConnection so spät, um sicherzustellen, wie möglich und sofort wieder zu schließen

  • und mit der SqlDataAdapter, müssen Sie Ihre Verbindung nicht einmal explizit öffnen/schließen - der Datenadapter wird dies für Sie tun

  • keine unnötigen zusätzlichen Objekte verwenden, wie Ihr DataSet - nur die DataTable direkt füllen!

So sollte Ihr Code sein:

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; 
} 

einige der anderen respondants Wie bereits erwähnt:

  • nicht zurück 20'000 Zeilen ..... zurückgeben so viele, wie Ihr Raster zeigen kann, ist alles mehr eine Verschwendung von Zeit, Raum und Rechenleistung

  • a lso: Ich mache besonders nicht, wie die Idee in einer SqlCommand von vorbei - wenn ich diese Methode schreiben waren, habe ich in der SQL-Abfrage als String übergeben würde und die SqlCommand nur innerhalb dieser Methode erstellen

Eine abschließende Empfehlung: In dieser Zeit und Alter würde ich versuchen, aus dem Reihen/Spalten basierten Programmiermodell zu entfernen - das ist soooo 20. Jahrhundert .... Sie sollten definitiv in ORM - Object-Relational Mapper - schauen, die sich drehen können Ihre Datenbankzeilen/-spalten in programmierfreundliche Objekte und dann diese zum Programmieren verwenden.

Check out NHibernate, Linq-to-SQL, Entity Framework v4 oder andere ... um mit DataTable und DataRow noch Chaos mit sehr niedrigem Niveau und nicht sehr produktiv!

+0

Der 'Using'-Punkt ist akademisch - er entsorgt Objekte bereits korrekt in einem finally-Block. – Jamiec

+0

@Jamiec: Nein, mit den 'using' Blöcken ist das allgemein akzeptierte Best Practice - mach es, gewöhne dich dran - mach dir nie mehr Gedanken um einen' finally' Block (und nichts Schlimmes passiert, wenn du das jemals vergessen solltest 'Block .....) –

+0

oh ich tue es tatsächlich, es ist nur ich dachte, es war ein merkwürdiger Punkt zu sehen, da er bereits wusste, diese Objekte zu entsorgen. – Jamiec

0

Ihr Schnipsel ist im Großen und Ganzen nicht schlecht, aber ein paar Notizen.

1) Sie alle Ausnahmen ignorieren, die auftreten, kann dies nur hier in Ihrem Beispiel sein, aber wenn nicht das ist sehr schlecht. Sie sollten die Fehler protokollieren.

2) Sie verwenden die schreckliche Form der ungarischen Notation. Sie sollten diese Gewohnheit zugunsten anderer C# -Entwickler, mit denen Sie jetzt oder in Zukunft arbeiten, verlassen.

3) Das Anzeigen von 20K-Datensätzen für einen Benutzer ist Wahnsinn. Es wird langsam zu rendern und fast völlig nutzlos sein, da kein Mensch durch diese vielen Aufzeichnungen strömen wird. Stellen Sie eine intelligentere Benutzeroberfläche bereit, indem Sie eine Suche, einen Filter oder eine Kombination aus beidem verwenden.

Wie für die Frage DataAdapter/DataReader; Es macht keinen Unterschied, da ein Datenadapter ohnehin einen Datenleser unter der Haube verwendet. Eine bessere Frage könnte lauten: "Soll ich ein DataSet oder mein eigenes benutzerdefiniertes Objekt zur Darstellung von Datensätzen verwenden?" und die Antwort wäre, dass Sie ein DataSet verwenden sollten, wenn die zusätzliche Funktionalität, die es zur Verfügung stellt (z. B. das Aufrechterhalten des Status jedes Datensatzes), erforderlich ist. In Ihrem Fall, wo die Datensätze nur abgerufen werden, um auf einem Raster anzuzeigen, würde ich wahrscheinlich nicht raten.

0

Warum Sie 20.000 oder mehr Datensätze aus der Datenbank zurückgegeben werden. Ich denke, Sie sollten Datensätze entsprechend Ihrer GridView-Seitengröße abrufen.

zum Beispiel, wenn Ihre Gridview Seitengröße ist 10, dann können Sie nur 10 Datensätze von db erhalten.

0

1-Wenn Ihre Daten nicht benutzerspezifisch sind und irgendeine Art von statischen, auch wenn es für ein paar Stunden statisch ist (was ich denke, ist der Fall hier), können Sie die Daten abrufen und in einem Cache speichern und präsentieren Diese zwischengespeicherten Daten für den Benutzer können auf diese Weise reduziert werden, um die Datentabelle für jede Benutzeranforderung erneut zu füllen. Wenn der obige Punkt nicht Ihr Fall ist, lesen Sie die Daten in Chunks und verwenden Sie Paging, um die zurückgegebenen Daten zu reduzieren, da kein Benutzer mehr als 20000 Zeilen gleichzeitig sehen kann schneller.

Caching kann in beiden oben genannten Punkten verwendet werden, um den Durchsatz Ihrer Anwendung zu erhöhen.

Verwandte Themen