2009-03-29 5 views
12

Meine Windows Forms-Anwendung verwendet ein stark typisiertes Dataset, das mit dem Designer in Visual Studio erstellt wurde. Zur Laufzeit möchte ich gerne die Live- oder Test-Datenbank auswählen können.Die beste Methode zum Festlegen einer stark typisierten Dataset-Verbindungszeichenfolge zur Laufzeit?

Was ist der beste Weg, die Verbindungszeichenfolge für das Dataset zur Laufzeit programmatisch festzulegen?

+0

Ab VS2010 kann die Sichtbarkeit der Verbindung s sein pecified (z.B. public) und eine Basisklasse für die generierten DataTableAdapters kann angegeben werden ... (das heißt, dieser Beitrag bezieht sich hauptsächlich auf VS2008 und vorherige Ausgaben :-) –

Antwort

1

Speichern Sie die Verbindungszeichenfolgen für beide in einer app.config und dann können Sie basierend auf einem Befehlszeilen-/Startschalter wechseln. Oder wenn Sie dem Benutzer die Flexibilität geben möchten, können Sie ihm eine Optionsseite geben, auf der er auswählen kann, welche Verbindung er verwenden soll.

Unten ist der Code ein Start-up-Schalter zu lesen:

string[] args = Environment.GetCommandLineArgs(); 
// The first (0 index) commandline argument is the exe path. 
if (args.Length > 1) 
{ 
    if (Array.IndexOf(args, "/live") != -1) 
    { 
     // connection string = 
     // ConfigurationSettings.AppSettings["LiveConString"]; 
    } 
} 
else 
{ 
    // connection string = 
    // ConfigurationSettings.AppSettings["TestConString"]; 
} 

Sie also jetzt Ihre Anwendung starten, indem Sie anrufen:

MyApp.exe /live 

Mit MyApp.exe allein oder mit einem anderen Schalter werden besorge dir die Testkonfiguration.

+0

Vielen Dank für Ihre Antwort, aber meine Frage ist, wie können Sie die Verbindungszeichenfolge von Ein stark typisiertes Dataset zur Laufzeit. – wethercotes

1

Re: wethercotes Kommentar

Der Assistent speichert die Verbindungszeichenfolge, wenn Sie den Datensatz einrichten, sondern dass Sie bedeutet nicht, nicht dynamisch machen. Dies hängt davon ab, welche Version Sie verwenden, aber wenn Sie die Dateien unter Ihrem Dataset erweitern, finden Sie im Allgemeinen eine Datei wie Designer.cs oder DataTableNameAdapter.xsd. Sie können diese Dateien öffnen und nach _connection suchen. Dies ist normalerweise eine private Variable und wird in einer Init-Funktion in der Klasse festgelegt.

Sie können die Einstellung dynamisch machen, indem Code hinzufügen wie folgt aus:

public string ConnectionString 
{ 
    get { return this._connection.ConnectionString; } 
    set 
    { 
     if (this._connection == null) 
     { 
      this._connection = new System.Data.SqlClient.SqlConnection(); 
     } 
     this._connection.ConnectionString = value; 
    } 
} 

Beachten Sie, wenn Sie den Datensatz regenerieren werden Sie wahrscheinlich diesen Abschnitt von Code verlieren, und ohne den Datensatz Refactoring können Sie hinzufügen es zu mehreren Objekten.

+0

Danke nochmal Gary. Ich habe eine partielle Klasse mit Ihrem Code erstellt, die verhindert, dass sie verloren geht, wenn das Dataset neu generiert wird. Leider muss dies für jeden Datenadapter gemacht werden, von dem ich Dutzende habe. – wethercotes

0

beste Lösung, die ich bisher gefunden:

ein anderes Programm Einstellung hinzufügen, die vom Client zur Laufzeit (zB newConnectionString.)

dann nach auch zahlreiche Serviceleistungen und Verbindungszeichenfolge hält vor mit den Tabellen-Adapter:

this.myTableAdapter.Connection.ConnectionString = Properties.Settings.Default.newConnectionString; 
+0

Nein, du kannst es nicht so machen. Die Verbindungseigenschaft in TableAdapters ist als intern definiert. –

+0

Funktioniert kein Problem für mein Projekt ... – yimbot

3

Connection-Eigenschaft in Tableadapter als internen definiert ist.

internal global::System.Data.SqlClient.SqlConnection Connection 

Also falls Ihr TypedDataset ist nicht in die gleiche Anordnung wie Ihre Hauptfenster Formen App, die Sie nicht Zugang Connection-Eigenschaft können. Dieses Problem könnte später auftreten, wenn Sie Ihren Datensatzcode umgestalten und ihn in ein separates Projekt verschieben, das seine eigene unabhängige Baugruppe erzeugt.

Um dieses Problem zu lösen, können Sie wie unten beschrieben vorgehen.

Erstellen Sie eine partielle Klasse für Ihren TableAdapter und fügen Sie neben dem standardmäßigen öffentlichen parameterlosen Konstruktor einen weiteren Konstruktor hinzu. Unter der Annahme, Table Typ als MyTableAdapter

public partial class MyTableAdapter 
{ 
    public MyTableAdapter(SqlConnection connection) 
    { 
     thisSetConnection(connection); 
     this.ClearBeforeFill = true; 
    } 

    public void SetConnection(SqlConnection connection) 
    { 
     this._connection = connection; 
    } 
} 

Sie müssen dies als Tableadapter für so viele tun Sie in Ihrem Projekt haben. TableAdapter hat keine gemeinsame Basisklasse, aber danke, dass sie als partielle Klassen deklariert sind, so dass wir es wie oben beschrieben machen können.

Jetzt zur Laufzeit, können Sie eine Instanz der Table wie diese schaffen ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(connection); 

oder sogar später zuweisen, nachdem Sie die Table Instanz mit Standard parameterlos öffentlichen Konstruktor erstellen ..

SqlConnection connection; 
//create the connection here at runtime.. 
MyTableAdapter adapter = new MyTableAdapter(); 
adapter.(connection); 
0

Es ist ein Schmerz, die Designer-Datei zu bearbeiten.

Ich habe einen Eintrag Einstellungen unter „User‚genannt ‚Connectionstring‘, die Visual Studio erstellen Sie eine Anwendung Zeichenfolge macht ‚Verbindung String1‘, wenn Sie setzen eine stark typisierte Daten hinzufügen.

Also, ich alle nur ersetzen‘ ConnectionString1 'mit' ConnectionString 'in der Dataset-Designer-Datei und erlaubt es Ihnen, eine' User'-String-Einstellung zu verwenden, um Ihre Verbindungszeichenfolge zur Laufzeit zu laden

IMHO ist es ein Manko, Benutzern zu erlauben, Verbindungszeichenfolgen zur Laufzeit zu ändern. (Wer hört in Redmond?)

Verwandte Themen