Announcement

Collapse
No announcement yet.

TableAdapter und Transaktionen / ConnectionStrings

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

  • TableAdapter und Transaktionen / ConnectionStrings

    Hallo,

    ich hätte mal ein paar Fragen zu den TableAdaptern in .NET 2.0.

    Ich habe dabei folgende Anwendungsarchitektur:

    - Aufteilung der Anwendung (Windows Forms, Business Logic) in mehrere DLL und EXE-Dateien wegen Pluginfähigkeit und Trennung der Schichten / Module
    - SQL Server 2005
    - Verwendung von Transaktionen (z. B. mit System.Transactions.TransactionScope)

    Nun zu meinen Problemen:

    - Der ConnectionString wird für jedes einzelne Business Logic Projekt in der app.config gespeichert, d. h. ich muss den ConnectionString nicht nur ein mal sondern öfters anpassen
    - Mit jedem neuen TableAdapter wird eine neue SqlConnection geöffnet, dadurch funktionieren Transaktionen nicht mehr, da TransactionScope eine gemeinsame Connection erwartet

    Ich könnte zwar jedem TableAdapter eine gemeinsame SqlConnection zuweisen, jedoch ist dies ein großer Aufwand und habe dadurch immer noch nicht das Problem mit den verschiedenen ConnectionStrings gelöst.

    Gibt es für meine Probleme vernünftige Lösungen oder muss ich mich von den DataSet's verabschieden und eine eigene Lösung programmieren?

    Mit freundlichen Grüßen
    Stefan Sturm

  • #2
    Hallo,

    >...muss ich mich von den DataSet's verabschieden ...

    nein.

    Dieses Problem und die alternativen Lösungswege habe ich in meiner Tipps&Tricks-Session auf der BASTA!2006 vorgestellt, in der nächsten und übernächsten Ausgabe des <i>dot.net magazin</i> wird der TableAdapter und das Transaktionsproblem vorgestellt .

    &gt;Mit jedem neuen TableAdapter wird eine neue SqlConnection geöffnet...

    Aber nur dann, wenn <b>vorher</b> die SqlConnection nicht bereits geöffnet war. Bei dem folgenden Beispiel tritt das Problem nicht auf:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Connection.ConnectionString = <span style="color: maroon;">" &lt; aktuelle Version &gt;"</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Connection.Open();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">try</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">using</span> (<span style="color: teal;">TransactionScope</span> txScope = <span style="color: blue;">new</span> <span style="color: teal;">TransactionScope</span>())</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">TransactionInformation</span> txInfo = <span style="color: teal;">Transaction</span>.Current.TransactionInformation;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listBox1.Items.Add(<span style="color: teal;">String</span>.Format(<span style="color: maroon;">"{0}: {1}"</span>,</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; txInfo.Status, txInfo.DistributedIdentifier));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Fill(tempdbDataSet.TestTbl);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tempdbDataSet.TestTbl.Rows[0][<span style="color: maroon;">"wert"</span>] = <span style="color: maroon;">"Neu3"</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Update(tempdbDataSet);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listBox1.Items.Add(<span style="color: teal;">String</span>.Format(<span style="color: maroon;">"{0}: {1}"</span>,</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; txInfo.Status, txInfo.DistributedIdentifier));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; txScope.Complete();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; listBox1.Items.Add(<span style="color: teal;">String</span>.Format(<span style="color: maroon;">"{0}: {1}"</span>,</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; txInfo.Status, txInfo.DistributedIdentifier));</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">finally</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Connection.Close();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

    Zur Kontrolle kann man dies auch im SQL Server prüfen:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">SELECT </span>spid, status, program_name, cmd </p><p style="margin: 0px;"><span style="color: blue;">FROM </span>master.dbo.sysprocesses <span style="color: blue;">WITH </span>(NOLOCK) </p><p style="margin: 0px;"><span style="color: blue;">WHERE </span>dbid = <span style="color: blue;">DB_ID</span>(<span style="color: maroon;">'tempdb'</span>);</p></div>

    Über die partiellen Klassen kann man den TableAdapter jedoch auch um eigene bzw. überladene Methoden erweitern. Über diesen Weg kann mit einer Handvoll von Programmzeilen der "alte Weg" über <b>SqlTransaction</b> nachgerüstet werden:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Connection.Open();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">try</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">SqlTransaction</span> aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTran = testTblTableAdapter.BeginTransaction(testTblTableA dapter.Connection);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">try</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Fill(tempdbDataSet.TestTbl);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; tempdbDataSet.TestTbl.Rows[0][<span style="color: maroon;">"wert"</span>] = <span style="color: maroon;">"Neu4"</span>;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Update(tempdbDataSet);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTran.Commit();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">catch</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; aTran.Rollback();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">finally</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; testTblTableAdapter.Connection.Close();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p></div>

    Die Erweiterung des Beispiel sieht wie folgt aus:

    <div style="font-family: Courier New; font-size: 10pt; color: black; background: white; border-top: windowtext 1pt solid; padding-top: 0pt; border-left: windowtext 1pt solid; padding-left: 0pt; border-right: windowtext 1pt solid; padding-right: 0pt; border-bottom: windowtext 1pt solid; padding-bottom: 0pt;"><p style="margin: 0px;"><span style="color: blue;">using</span> System;</p><p style="margin: 0px;"><span style="color: blue;">using</span> System.Data;</p><p style="margin: 0px;"><span style="color: blue;">using</span> System.Data.SqlClient;</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">namespace</span> ClientCS</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: teal;">tempdbDataSet</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: green;">// eigene DataSet-Erweiterungen</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p><p style="margin: 0px;">&nbsp;</p><p style="margin: 0px;"><span style="color: blue;">namespace</span> ClientCS.tempdbDataSetTableAdapters</p><p style="margin: 0px;">{</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; <span style="color: blue;">partial</span> <span style="color: blue;">class</span> <span style="color: teal;">TestTblTableAdapter</span></p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">public</span> <span style="color: teal;">SqlTransaction</span> BeginTransaction(<span style="color: teal;">SqlConnection</span> aCon)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (aCon.State != <span style="color: teal;">ConnectionState</span>.Open)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">throw</span> <span style="color: blue;">new</span> <span style="color: teal;">ArgumentException</span>(<span style="color: maroon;">"Die Datenbankverbindung ist noch geschlossen!"</span>);</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Connection = aCon;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: teal;">SqlTransaction</span> aTran = Connection.BeginTransaction();</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">foreach</span> (<span style="color: teal;">SqlCommand</span> cmd <span style="color: blue;">in</span> <span style="color: blue;">this</span>.CommandCollection)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> (cmd != <span style="color: blue;">null</span>)</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; cmd.Transaction = aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((Adapter.InsertCommand != <span style="color: blue;">null</span>))</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Adapter.InsertCommand.Transaction = aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((Adapter.DeleteCommand != <span style="color: blue;">null</span>))</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Adapter.DeleteCommand.Transaction = aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((Adapter.UpdateCommand != <span style="color: blue;">null</span>))</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Adapter.UpdateCommand.Transaction = aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">if</span> ((Adapter.SelectCommand != <span style="color: blue;">null</span>))</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; {</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; Adapter.SelectCommand.Transaction = aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; <span style="color: blue;">return</span> aTran;</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; &nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">&nbsp;&nbsp;&nbsp; }</p><p style="margin: 0px;">}</p></div>

    Da die voreingestellte Basisklasse <i>System.ComponentModel.Component </i> des TableAdapters im Eigenschaftsdialog über die Eigenschaft <b>BaseClass</b> ausgetauscht werden kann, kann allen im Projekt vorhandenen TableAdaptern eine eigene Erweiterung "untergeschoben" werden (auch wenn dies dann nur greift, wenn dort über Reflection die "nachfolgenden" TableAdapter-Teile geändert werden).

    &gt;Der ConnectionString wird für jedes einzelne Business Logic Projekt in der app.config gespeichert...

    Diese Vorbelegung ist für den TableAdapter nicht zwingend notwendig. Auf Wunsch darf die app.config aus dem Projekt (Bsp: Class Library kapselt den TableAdapter ein) auch entfernt werden - dann allerdings muss vor dem Öffnen der Datenbankverbindung die Verbindungszeichenfolge in eigener Regie initialisiert werden.
    &#10

    Comment


    • #3
      @ Andreas Kosch

      Da ich auch ähnliche Probleme mit dem Anpassen des ConnectionString für den TableAdapter hatte und habe würde ich mich für diese Thema ebenfalls interessieren....

      Ich arbeite aber mit VB-Code....

      Du schreibst das in einer der nächsten ( mittlerwile wohl vergangenen ) Ausgaben des dot.net magazins das Thema behandelt wird/wurde....

      Kannst du mir die Ausgabenummern nennen. Ich würde mir diese gern noch besorgen....

      Ich benötige allerdings auch mal Grundlegende Info`s zum TableAdapter. Finde ich die auch in den Ausgaben...?

      Oder wo bekomme ich solche Info`s ( sollten auch einigermassen verständlich sein ) am besten her...?

      Schon mal besten Dank für deine Bemühungen...

      Comment


      • #4
        Hallo,

        Kannst du mir die Ausgabenummern nennen.
        der Nachfolge-Artikel ist noch nicht im dot.net magazin erschienen, weil sich bisher andere Themen "vorgedrängelt" haben

        Ich arbeite aber mit VB-Code....
        Auch dort steht die partielle Klasse zur Verfügung, so dass die wenigen Programmzeilen des C#-Beispiels nach dem Entfernen des Semikolons auch dort untergebracht werden können, nachdem die Syntax ausgetauscht wurde.

        Comment

        Working...
        X