2009-03-29 10 views
12

L'applicazione Windows Form utilizza un set di dati fortemente tipizzato creato utilizzando la finestra di progettazione in Visual Studio. In fase di esecuzione vorrei poter selezionare il database di test o dal vivo.Il modo migliore per impostare una stringa di connessione del set di dati fortemente tipizzata in fase di runtime?

Qual è il modo migliore per impostare in modo programmatico la stringa di connessione per il set di dati in fase di esecuzione?

+0

A partire da VS2010 la visibilità della connessione può essere s specificato (ad es. pubblico) e una classe base per i DataTableAdapters generati può specificare ... (cioè, questo post è principalmente correlato a VS2008 e problemi precedenti :-) –

risposta

1

Archiviare stringhe di connessione per entrambi in un app.config e quindi è possibile passare in base a una riga di comando/interruttore di avvio. O se vuoi dare all'utente la flessibilità, puoi dare loro una pagina di opzioni in cui possono selezionare quale connessione usare.

Di seguito si riporta il codice per leggere un interruttore di start-up:

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

Così ora di iniziare la vostra applicazione chiamando:

MyApp.exe /live 

Utilizzando solo MiaApp.exe o con qualsiasi altro interruttore sarà ottenere la configurazione di prova.

+0

Grazie per la risposta, ma la mia domanda è come si può impostare la stringa di connessione di un dataset fortemente tipizzato in fase di runtime. – wethercotes

1

Re: wethercotes commento

I negozi guidata stringa di connessione quando si imposta il set di dati, ma ciò non significa che non si può rendere dinamica. In che modo dipende dalla versione che stai utilizzando, ma in generale se espandi i file sotto il tuo set di dati troverai un file come Designer.cs o DataTableNameAdapter.xsd. È possibile aprire quei file e cercare _connection. Di solito è una variabile privata ed è impostata in una funzione init nella classe.

È possibile effettuare la dinamica impostazione con l'aggiunta di codice come il seguente:

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

Si noti che se si rigenera il set di dati è probabile che perderà questa sezione di codice, e senza refactoring il set di dati potrebbe essere necessario aggiungere a più oggetti.

+0

Grazie ancora Gary. Ho creato una classe parziale con il tuo codice al suo interno che impedisce che si perda quando il set di dati viene rigenerato. Sfortunatamente questo deve essere fatto per ogni adattatore dati, che ho dozzine di. – wethercotes

0

soluzione migliore che ho trovato finora:

Aggiungi un'altra impostazione del programma che contiene la stringa di connessione preferito per il tuo come stabilito dal cliente in fase di esecuzione (ad es newConnectionString.)

di prima mediante l'alimentatore da tavolo:

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

No, non puoi farlo in questo modo. La proprietà di connessione in TableAdapters è definita come interna. –

+0

Non funziona alcun problema per il mio progetto ... – yimbot

3

proprietà Connection in TableAdapters è definito come interna.

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

Quindi, nel caso in cui il vostro TypedDataset non è nel stesso assieme come le finestre principali forme applicazione, non sarà in grado di accedere proprietà Connection. Questo problema potrebbe essere visualizzato in un secondo momento quando si rafforza il codice del set di dati in un progetto separato che produce un proprio assieme indipendente.

Per risolvere questo problema, è possibile fare come indicato di seguito.

creare una classe parziale per il TableAdapter e aggiungere un altro costruttore accanto al costruttore pubblico senza parametri predefinito. Assumendo tipo TableAdapter come MyTableAdapter

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

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

Sarà necessario fare questo per come molti come TableAdapters avete nel vostro progetto. TableAdapter non ha una classe base comune, ma grazie al fatto che sono dichiarati come classi parziali, quindi siamo in grado di farlo come sopra menzionato.

Ora in fase di esecuzione, è possibile creare un'istanza del TableAdapter come questo ..

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

o può essere anche assegnarlo più tardi, dopo aver creato l'istanza TableAdapter con predefinito senza parametri costruttore pubblico ..

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

È un problema modificare il file di progettazione.

Ho creato una voce Impostazioni sotto la voce "User 'chiamata 'ConnectionString', il che rende Visual Studio creare una stringa di applicazione 'Connessione String1' quando si aggiunge un dato fortemente tipizzato set.

Allora, ho appena Sostituisci tutto' ConnectionString1 'con' ConnectionString 'nel file del dataset designer e che ti permetteranno di usare una stringa di' User 'per caricare la stringa di connessione durante il runtime

IMHO è un difetto che consente agli utenti di modificare stringhe di connessione in fase di esecuzione. (Chi ascolta in Redmond?)

Problemi correlati