2009-03-29 12 views
12

Moja aplikacja Windows Forms używa silnie wpisanego zestawu danych utworzonego za pomocą projektanta w Visual Studio. W czasie wykonywania chciałbym móc wybrać bazę danych na żywo lub testową.Najlepszy sposób na ustawienie silnie wpisanego ciągu znaków zestawu danych w czasie wykonywania?

Jaki jest najlepszy sposób programowo ustawić ciąg połączenia dla zestawu danych w czasie wykonywania?

+0

Od VS2010 widoczność połączenia może być s pecified (np. public) i klasa podstawowa dla wygenerowanych DataTableAdapters może być określona ... (to znaczy, ten post jest głównie związany z VS2008 i wcześniejszymi problemami :-) –

Odpowiedz

1

Przechowuj łańcuchy połączeń dla nich zarówno w pliku app.config, a następnie przełącz się na podstawie wiersza poleceń/przełącznika uruchamiania. Lub jeśli chcesz dać użytkownikowi elastyczność, możesz dać mu stronę opcji, na której mogą wybrać, z którego połączenia korzystać.

Poniżej znajduje się kod, aby przeczytać rozruchu przełącznik:

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

Więc teraz uruchomić aplikację pod numerem:

MyApp.exe /live 

Korzystanie MojaAplik.exe samodzielnie lub z każdym innym przełączniku dostaniesz konfigurację testu.

+0

Dziękuję za odpowiedź, ale moje pytanie brzmi: jak ustawić ciąg połączenia mocno napisany zestaw danych w czasie wykonywania. – wethercotes

1

Re: wethercotes skomentować

sklepach kreatora ciąg połączenia podczas konfigurowania zestawu danych, ale to nie znaczy, że nie może to dynamiczna. Jak zależy od wersji, z której korzystasz, ale ogólnie, jeśli rozszerzysz pliki w swoim zbiorze danych, znajdziesz plik jak Designer.cs lub DataTableNameAdapter.xsd. Możesz otworzyć te pliki i wyszukać _connection. Jest to zazwyczaj zmienna prywatna i jest ustawiona w funkcji init w klasie.

Można dokonać ustawień dynamicznego dodając kod jak poniżej:

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

Zauważ, że jeśli zregenerować zestaw danych będzie prawdopodobnie stracić tej części kodu, bez refactoring zestaw danych może trzeba dodać do kilku obiektów.

+0

Jeszcze raz dziękuję Gary. Stworzyłem częściową klasę z twoim kodem, który zatrzymuje ją, gdy zbiór danych jest regenerowany. Niestety należy to zrobić dla każdego adaptera danych, który mam dziesiątki. – wethercotes

0

Najlepsze rozwiązanie znalazłem dotąd:

Dodaj kolejny ustawienia programu, który posiada preferowany ciąg połączenia określonych przez klienta w czasie wykonywania (np newConnectionString.)

następnie przed za pomocą adaptera tabeli:

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

Nie, nie możesz tego zrobić w ten sposób. Właściwość połączenia w TableAdapters jest zdefiniowana jako wewnętrzna. –

+0

Nie stanowi problemu dla mojego projektu ... – yimbot

3

właściwość połączenia w TableAdapters jest zdefiniowany jako wewnętrznej.

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

Tak więc w przypadku, gdy nie jest w TypedDataset samo jak montaż głównych okien formy aplikacji, nie będzie mógł dostępu właściwości połączenia. Ten problem z numerem może zostać rozwinięty później, gdy zmienisz kod zestawu danych i przeniesiesz go do oddzielnego projektu, który będzie produkować niezależny zespół.

Aby rozwiązać ten problem, można wykonać, jak wspomniano poniżej.

utwórz klasę częściową dla tabeli TableAdapter i dodaj kolejny konstruktor obok domyślnego publicznego konstruktora bez parametrów. Zakładając typ TableAdapter jak MyTableAdapter

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

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

Trzeba to zrobić dla aż TableAdapters masz w swoim projekcie. TableAdapter nie ma żadnej wspólnej klasy bazowej, ale dzięki temu są one deklarowane jako klasy częściowe, więc jesteśmy w stanie zrobić to w sposób opisany powyżej.

Teraz przy starcie, można utworzyć instancję swojej TableAdapter tak ..

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

lub można nawet przypisać ją później po utworzeniu instancji TableAdapter z domyślnego konstruktora bez parametrów publicznego ..

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

Edycja pliku projektanta jest trudna.

stworzyłem wpis ustawienia w „User«o nazwie «ConnectionString», co sprawia, że ​​Visual Studio utworzyć ciąg aplikacji «Połączenie String1» podczas dodawania silnie typami zestawu danych.

Więc, po prostu wymienić wszystkie» ConnectionString1 'with' ConnectionString 'w pliku projektanta zbioru danych, który pozwoli ci użyć ustawienia ciągu "User" do załadowania ciągu połączenia w czasie wykonywania.

IMHO to wada pozwalająca użytkownikom modyfikować ciągi połączeń w czasie wykonywania. (Ktoś słuchający w Redmond?)

Powiązane problemy