Announcement

Collapse
No announcement yet.

Zugriff auf SqlConnection-Object

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zugriff auf SqlConnection-Object

    Hallo,

    ich habe folgende Frage, vielleicht kann mir jemand helfen:
    Wie kann ich auf das in einem TableAdapter verwendete SqlConnection-Object zugreifen, um z.B. nach dem Schließen des letzten Formulars mit der Methode "ClearAllPools" sicherzustellen, daß auch wirklich alle Verbindungen geschlossen werden.
    Der TableAdapter wurde vollständig über den Assistenten erstellt.

    Danke im voraus für einen hilfreichen Hinweis.
    Rudolf Bleil

  • #2
    Hallo,

    Wie kann ich auf das in einem TableAdapter verwendete SqlConnection-Object zugreifen...
    für diese Aufgabe gibt es zwei verschiedene Lösungswege:
    1. Im DataSet-Designer sorgt ein Doppelklick auf den hellblau gestreiften Designerhintergrund dafür, dass Visual Studio 2005 eine weitere partielle Klasse für den TableAdapter anlegt anlegt. Dort kann eine eigene öffentliche Methode untergebracht werden, in der ClearAllPools aufgerufen wird.
    2. Über die Eigenschaft ConnectionModifier wird die Sichtbarkeit der TableAdapter-Eigenschaft Connection gesteuert. In der Voreinstellung wird ConnectionModifier auf Internal (C#) beziehungsweise Friend (VB) gesetzt, so dass die TableAdapter-Eigenschaft Connection nur innerhalb der eigenen Assembly sichtbar ist. Wenn der Eigenschaft Connection eine bereits geöffnete SqlConnection-Instanz zugewiesen wird, greift der TableAdapter auf die bereits bestehende Verbindung zurück. Der Aufruf von ClearAllPools kann somit "von Außen" erfolgen.


    Code:
    ...
       using (SqlConnection aCon = new SqlConnection(
          Properties.Settings.Default.tempdbConnectionString))
       {
           aCon.Open();
           try
           {
             masterTableAdapter.Connection = aCon;
             masterTableAdapter.Fill(dataSetMasterDetail.Master);
             detailTableAdapter.Connection = aCon;
             detailTableAdapter.Fill(dataSetMasterDetail.Detail);
           }
           finally
           {
             aCon.Close();
             SqlConnection.ClearAllPools();		
           }
       }
    ...

    Comment


    • #3
      Hallo Herr Kosch,

      es tut mir leid, aber wenn ich den weissblauen Hintergrund des Designers doppelclicke, bekomme ich eine partielle Klasse des Dataset und nicht des TableAdapters. Was mache ich da falsch?

      Könnten Sie mir bitte ev. zu Ihrem Pkt.1 auch noch ein Beispiel zeigen?
      (Bitte in VB wenn es möglich ist.)

      Dankeschön im voraus
      Rudolf Bleil

      Comment


      • #4
        Hallo,

        ...bekomme ich eine partielle Klasse des Dataset und nicht des TableAdapters.
        an dieser Stelle gibt es keinen Unterschied, wie die angehängte Abbildung zeigt. Der TableAdapter ist ja die Kombination von einem typisierten DataSet mit einem typisierten SqlDataAdapter.

        Bitte in VB wenn es möglich ist
        Ein Beispiel in Visual Basic 2005 könnte so aussehen: Zuerst kopiert man den Namespace und die Deklaration der partiellen Klasse des TableAdapters aus der von Visual Studio 2005 angelegten .Designer.vb. Danach rüstet man dort die öffentlichen Eigenschaften und Methoden nach, die gewünscht werden. Dort kann man auch die vorhandenen Methoden (wie zum Beispiel Update) überladen, um das Standardverhalten des TableAdapters zu ändern.

        <div style="font-family: Courier New; font-size: 10pt; color: black; background: white;"><pre style="margin: 0px;"><span style="color: blue;">Partial</span> <span style="color: blue;">Class</span> DataSet1</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' Die partielle Klasse des typisierten DataSets </span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: green;">' wird in diesem Beispiel nicht ben&#246;tigt</span></pre><pre style="margin: 0px;"><span style="color: blue;">End</span> <span style="color: blue;">Class</span></pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;"><span style="color: green;">' Die Deklaration aus DataSet1.Designer.vb &#252;bernehmen</span></pre><pre style="margin: 0px;"><span style="color: blue;">Namespace</span> DataSet1TableAdapters</pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">Partial</span> <span style="color: blue;">Public</span> <span style="color: blue;">Class</span> TestTblTableAdapter</pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Beispiel: Verbindungszeichenfolgen als Eigenschaft ver&#246;ffentlichen</span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Public</span> <span style="color: blue;">ReadOnly</span> <span style="color: blue;">Property</span> AdapterConnectionString() <span style="color: blue;">As</span> <span style="color: blue;">String</span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Get</span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Return</span> <span style="color: blue;">Me</span>.Connection.ConnectionString</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Get</span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Property</span></pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">' Beispiel: Verbindung schlie&#223;en und Pool leeren</span></pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Public</span> <span style="color: blue;">Sub</span> AdapterClearAllPools()</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">Me</span>.Connection.Close()</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; System.Data.SqlClient.SqlConnection.ClearAllPools( )</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Sub</span></pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">End</span> <span style="color: blue;">Class</span></pre><pre style="margin: 0px;">&nbsp;</pre><pre style="margin: 0px;"><span style="color: blue;">End</span> <span style="color: blue;">Namespace</span></pre></div>
        Attached Files

        Comment


        • #5
          Vielen Dank Herr Kosch!

          Jetzt nur noch eine letzte Frage dazu: Wann soll man denn am besten die Methode "ClearAllPools" aufrufen? Ich habe ja mehrere TableAdapter, es wird nicht nur gelesen, sondern auch in die DB zurückgeschrieben. Muß ich die Methode lt. Ihrem obigen Beispiel dann pro TableAdapter aufrufen, oder gilt "ClearAllPools" für alle ev. noch offenen Verbindungen?
          Ich bitte Sie nochmals um einen Hinweis, vielen Dank.

          Rudolf Bleil

          Comment


          • #6
            Hallo,

            Wann soll man denn am besten die Methode "ClearAllPools" aufrufen?
            die Methode ClearAllPools ist nur für den Fall vorgesehen, dass ein DBA einen exklusiven Zugriff auf die Datenbank benötigt und daher auf allen Client-Rechnern der Datenbankverbindungs-Pool geleert werden muss.

            Im Alltag ist das Leeren des Datenbankverbindungs-Pools nicht erforderlich. Es reicht aus, wenn die eigene Anwendung die SqlConnection-Instanz trennt (entweder implizit über using oder explizit über die Close-Methode). Selbst für den Fall, dass im Datenbankverbindungs-Pool eine "beschädigte" Verbindung liegt, räumt ADO.NET 2.0 beim nächsten Zugriff automatisch auf.

            Comment


            • #7
              Vielen Dank, Herr Kosch!

              Comment

              Working...
              X