2010-12-17 7 views
3

Möchten Sie einfach sicherstellen, dass dies die beste Möglichkeit ist, eine Verbindung aufzurufen und Daten aus einer Datenbank zu entnehmen, oder sollte ich den Datenleser außerhalb der using-Anweisung aufrufen? (um die Verbindung schneller schließen zu können?) oder gibt es irgendetwas, was du persönlich ändern würdest?SQLConnection mit der Using-Anweisung, SQLDataReader von innen aufrufen?

Antwort

5

Sie können den Datenleser nicht erfolgreich außerhalb der using-Anweisung aufrufen, da eine offene Verbindung zum Lesen der Daten erforderlich ist.

Die Verbindung wird schnell genug geschlossen, wie Sie es haben, und nicht einmal wirklich "schließen". Es wird an den Verbindungspool zurückgegeben (vorausgesetzt, Sie verwenden einen). Da Sie wahrscheinlich sind, müssen Sie sich keine Gedanken darüber machen, wie schnell die Verbindung in diesem Kontext geschlossen wird, da andere Teile der Anwendung, die eine Verbindung benötigen, eine verfügbare Verbindung aus dem Pool verwenden. Dies setzt voraus, dass Sie keine Anwendung mit wirklich hohem Datenverkehr haben, sie könnte in diesem Szenario wichtig werden, aber das sind viele, viele gleichzeitige Benutzer, und Sie können dieses Problem beheben, indem Sie die Anzahl der Verbindungen im Pool erhöhen .

Chris brachte einen guten Punkt zu: Es sollte in einer using-Anweisung sein:

SqlDataReader dr = cm.ExecuteReader(); 

       while (dr.Read()) 
       { 
        firstName = (string)dr["GivenName"]; 
        lastName = (string)dr["sn"];; 
       } 
       dr.Close(); 

In diesem Beispiel, wenn Ihre Leser eine Ausnahme auslöst, wird es nicht immer bekommen dr.Close(); so wird es sein viel länger offen gelassen, als es sein muss (vielleicht sogar für das Leben der Anwendung).

Data Reader

+0

Ihnen danken, wollte nur sicher sein, dass Dies ist eine akzeptable Möglichkeit, Daten zu erfassen. Ich werde diesen Code weiterhin verwenden – Spooks

2

die DataReader- IDisposable implementiert, so dass es auch in einer using-Klausel eingewickelt werden soll. Alles andere sieht gut aus.

0

Ich würde in Betracht ziehen, die SQLConnection in eine Factory-Methode zu setzen. (Wenn es Lasten genannt wird)

Auch ich hätte keine while-Schleife um die dr.Read Sie erwarten nur eine Antwort, also was passiert, wenn es keine Ergebnisse oder viele Ergebnisse gibt ???? Nicht sicher, ob ich das Casting mag, aber wahrscheinlich OK.

ich amsume, dass Sie in etc bestanden Unit-Tests um diesen Code mit der Connectionstring wird ... haben (offensichtlich die Fabrik Idee härter machen würde Unit-Tests, so vielleicht nicht wert, ...)

Ihre Verwendung Aussagen sehen gut aus für mich.

5

Nicht nur Sie können keinen Anruf an die SqlDataReader außerhalb der using-Anweisung als alle in Variablen deklariert werden entfernt werden, und Sie benötigen eine geöffnete Verbindung zum Lesen der Daten, Sie sollten ein Objekt schreiben, das zurückgegeben wird, oder auch eine Liste Ihres Objekts.

public class MyObject { 
    public string FirstName { get; set; } 
    public string Surname { get; set; } 
} 

public IEnumerable<MyObject> GetObjects() { 
    ICollection<MyObject> myObjects = new List<MyObject>(); 

    using (SqlConnection cn = new SqlConnection(connStr)) 
    { 
     using (SqlCommand cm = new SqlCommand(connStr, cn)) 
     { 
      cm.CommandType = CommandType.StoredProcedure; 
      cm.CommandText = "GetExchRatesByDate"; 
      cm.Parameters.Add("@Date", SqlDbType.VarChar).Value = txtStartDate.Text; 
      cn.Open(); 

      using(SqlDataReader dr = cm.ExecuteReader()) 
       while (dr.Read()) { 
        MyObject myObject = new MyObject(); 
        myObject.FirstName = (string)dr["GivenName"]; 
        myObject.Surname = (string)dr["sn"]; 
        myObjects.Add(myObject); 
       } 
     } 
    } 
    return myObjects; 
} 
1

Andere bedeckt haben es aber noch eine Sache, die ich verwenden möchte, ist AddWithValue:

cm.Parameters.Add("@Date", SqlDbType.VarChar).Value = txtStartDate.Text; 

geschrieben werden könnte:

cm.Parameters.AddWithValue("@Date", txtStartDate.Text); 
Verwandte Themen