Laden...

connectionstring zur Laufzeit ändern?

Erstellt von Vanny vor 18 Jahren Letzter Beitrag vor 11 Jahren 27.735 Views
V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 18 Jahren
connectionstring zur Laufzeit ändern?

Hallo,
ich habe folgendes Problem: In meinem Projekt sind einige Datensets enthalten, die ich mit dem Designer eingebunden habe. In den settings habe ich dazu eine Verbindungszeichenfolge hinterlegt, die die Datasets benutzen. Zur Laufzeit werde ich aber wahrscheinlich eine andere Verbindung brauchen als auf dem Entwicklungsrechner, muß dann den connectionstring also ändern - aber der ist schreibgeschützt.
Auch das Hinzufügen eines alternativen Connectionstrings zu den settings bringt mich nicht weiter, weil nach Auswahl von (Verbindungszeichenfolge) der Anwendungsbereich auf "Anwendung" gesetzt wird, sich nicht auf "Benutzer" umstellen läßt und damit wieder read only ist.
Das manuelle Zusammenbauen eines neuen connectionstrings ist auch keine Alternative, weil es sehr viele Stellen gibt, an denen der jeweils geändert werden müsste.

2.223 Beiträge seit 2005
vor 18 Jahren

moin

auf anhieb würde ich vermuten dass dir bei der planung des projektes ein kleiner fehler unterlaufen ist

oder warum sollte dein connectioin string an mehreren stellen angepasst werden

anmerkung irgendwo wird dein test connectionstring gespeichert und geneu dort mußt du ihn ändern

mfg

V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 18 Jahren

Genau das will ich ja vermeiden (an mehreren Stellen ändern).
Meinst Du, ich soll den connectionstring in der Datei settings.settings ändern? Abgesehen davon, daß sich deren Name beim Veröffentlichen ändert wird der Inhalt sicher nur beim Programmstart eingelesen. Damit wäre nach einer Änderung des connectionstring ein Programmneustart fällig?
Ist unter den 4600 Klassen in .Net keine mit einer Methode, die einen connectionstring ändern kann?

2.223 Beiträge seit 2005
vor 18 Jahren

hi

ich würde immer den string aus der config datei nehmen
probiere es einfach mal aus ob dieser connection string nur beim
start geladen wird

ich vermute mal das dieser string bei jeder connection neu geladen wird

mfg

V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 18 Jahren

Aber das ist doch genau mein Problem: Im Moment benutzen alle Objekte genau diese Verbindungszeichenfolge. Die kann ich (scheinbar) nur im Editor ändern und mit dem Servernamen auf dem Entwicklungsrechner versehen.
Zur Laufzeit auf dem Zielsystem muß sie angepaßt werden, ggf. sogar mehrfach, damit ohne Neuinstallation auch mal ein anderer Server einspringen kann.

D
462 Beiträge seit 2005
vor 18 Jahren

Hallo!

ich gehe mal davon aus, dass du einen DataLayer hast. Und desweiteren, dass alle Commands dasselbe Connection-Objekt benutzen. Also einfach den ConnectString von diesem einem Connection-Object ändern.

mfg

V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 18 Jahren

Nochmal zur Erläuterung: Ich habe eine SQL-Server-DB erstellt und anschließend ein Projekt in VS 2005. Diesem habe ich ein Dataset hinzugefügt. Weil noch keine Verbindungszeichenfolge da war, hat der Assistent danach gefragt, ich habe die Verbindung eingegeben und sie wurde als connectionstring in den settings gespeichert.
Mangels konkreter Informationen über die Performance sehr umfangreicher Datasets habe ich mehrere erstellt und denen standardmäßig die erste erstellte Verbindungszeichenfolge zugewiesen. Außerdem gibt es noch einige verstreute SQL-Anweisungen im Code, die ebenfalls diesen connectionstring verwenden und über seinen Namen ansprechen.
Daher suche ich nach einer Möglichkeit, genau diesen namentlich bekannten connectionstring zur Laufzeit zu ändern, um in einem Einstellungen-Form Servertyp und DB-Namen ändern zu können.
Ich scheitere daran, daß er vom Typ Verbindungszeichenfolge ist, diese standardmäßig und nicht änderbar die Anwendung als Gültigkeitsbereich hat und damit der connectionstring jede Zuweisung eines anderen Wertes (z.b. mit ConfigurationManager.ConnectionStrings.Add(settings);
mit einer ConfigurationErrorsException (Die Konfiguration ist schreibgeschützt) endet.

M
121 Beiträge seit 2006
vor 17 Jahren
Gleiches Problem

Hi,
hab das gleiche Problem wie du und bin noch auf keine brauchbare Lösung gekommen. Finde es dumm dass diese Settings für die Connection nur ReadOnly sind.

Meine Idee war das ganze als *.ini Datei zu speichern, ich welcher dann (kann auch durch Crypto Funktion verschlüsselt sein) ein Connection string steht. Wenn das ganze dann auf einer neuen Umgebung installiert wird, soll die Datei gelöscht werden und mein Programm erlaubt eine Neueingabe dieser Connection.

Leider kann ich aber meinen App-Settings dies nicht zuweisen. Somit habe ich auch keinerlei Grundlage für die Datasets.
Hast du da vielleicht eine neue Lösung ?

Lieber Gruß
Markus

V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 17 Jahren

Hallo Markus,
meine Lösung ist eher ein Workaround: Ich habe den eigentlichen ConnectionString und benutze ihn zur Arbeit im VS. Parallel speichere ich die Elemente des ConnectionStrings als String und baue daraus zur Laufzeit einen ConnectionString zusammen, den ich dann überall im Code verwende.

HTH Vanny

484 Beiträge seit 2006
vor 17 Jahren

Original von Vanny
..
Zur Laufzeit auf dem Zielsystem muß sie angepaßt werden, ggf. sogar mehrfach, damit ohne Neuinstallation auch mal ein anderer Server einspringen kann.

Eine Änderung der config.Datei macht keine Neuinstallation erforderlich.

Wie merkt denn das Programm das der Server1 ausgefallen ist und er bitte schön
Server2 oder Server3 oder Server(n) verwenden soll?

Original von Vanny
Wenn das ganze dann auf einer neuen Umgebung installiert wird, soll die Datei gelöscht werden und mein Programm erlaubt eine Neueingabe dieser Connection.

Und wo speicherst Du diese Neueingabe?
Wenn die Software auf einer Neuen Umgebung installiert wird und nur einmal der
ConnectionString geändert werden soll, warum nicht einfach beim Setup der Anwendung den ConnectionString ändern?

Ich versteh das Problem irgendwie nicht richtig 🤔

Jörg

Gelöschter Account
vor 17 Jahren

äh vielleicht habe ich da was sehr sehr missverstanden aber ich habe datasets immer mit einem sqldataadapter befüllt und geupdatet. und da kann man die connectionstrings beliebig verändern...

484 Beiträge seit 2006
vor 17 Jahren

Original von joerguth
Ich versteh das Problem irgendwie nicht richtig 🤔

Jetzt hab ich es verstanden 🙂


public static void ModifyConnectionString(string connectionString)
        {
            // Bitte Test.Properties.Settings.AdventureWorksConnectionString entsprechend Anpassen
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.ConnectionStrings.ConnectionStrings["Test.Properties.Settings.AdventureWorksConnectionString"].ConnectionString = connectionString;
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);
            Properties.Settings.Default.Reload();
        } 

Versuch mal das

Happy Coding
Jörg

Mit Dank an http://msdn2.microsoft.com/en-us/library/ms134265.aspx

V
Vanny Themenstarter:in
16 Beiträge seit 2006
vor 17 Jahren

Danke, genau das habe ich gesucht.

Vanny

C
93 Beiträge seit 2007
vor 15 Jahren

Also auch von mir vielen Dank,

ohne Deinen Beitrag waere ich auch verzweifelt.

Es ist aus meiner Sicht (Amateur) echt schwierig nachzuvollziehen, warum
dieses maechtige Tool DataSet und zugehoerige DataTableAdapter um eine
derart wichtige Funktionalitaet beschnitten sind.

J
32 Beiträge seit 2008
vor 15 Jahren

Hi, falls ihr einen vorhanden ConnectionString zur Laufzeit verändern möchtet,
bietet sich hierzu die Klasse SqlConnectionStringBuilder an.

R
158 Beiträge seit 2007
vor 15 Jahren

...
Mit Dank an
>

und hier das ganze auf deutsch 😉 mit weiterführenden Links:
http://msdn.microsoft.com/de-de/library/ms134265.aspx

T
5 Beiträge seit 2008
vor 14 Jahren

hi ich buddel hier mal dieses alte Thema aus . Ich habe das selbe Problem das ich zur laufzeit den conncetion string ändern muss.

Ich habe auch mal das code bsp hier getestet doch leider ohne erfolg.

eventuell kann mir ja nochmal wer helfen

5.299 Beiträge seit 2008
vor 14 Jahren

Hier vlt. eine Lsg in VB. Wichtig v.a. das Settings.UserOverride.vb.
Kannman sich mit codeconverter so leidlich übersetzen.

Readme beacchten

Der frühe Apfel fängt den Wurm.

1.564 Beiträge seit 2007
vor 14 Jahren

Hallo Vanny

...Außerdem gibt es noch einige verstreute SQL-Anweisungen im Code, die ebenfalls...

Autsch... Das solltest du dringend aufräumen. Du solltest eine zentrale Stelle (eine oder mehrere zusammenhängende Klasse(n)) in deiner Applikation haben in der alle Statements hinterlegt sind. Sonst bekommst du gewaltige Probleme wenn sich mal Teile der Datenbankstruktur ändern.

Grüße
Flo

Blog: Things about Software Architecture, .NET development and SQL Server
Twitter
Google+

Je mehr ich weiß, desto mehr weiß ich was ich noch nicht weiß.

5.299 Beiträge seit 2008
vor 14 Jahren

Ach, ich kenn das vonne typisierten Datasets her. da kriegt man doch auch so DataAdapter hingeneriert, und bei denen kann man ebenfalls im Designer auch noch weitere Queries hinzufügen, das ist eigentlich recht geschickt, da hat man nämlich alles SQL an einer Stelle versammelt.

Nur wwenn man die blöden Dinger dann instanziert, macht sich jeder gleich mehrere Connections, und das ist nervig, da dann überall den Connectionstring zu ändern.
Aber deswegen dann ja auch die gegebene Lsg, wo das setting geändert wird, bevor es erstmalig geladen wurde.

Der frühe Apfel fängt den Wurm.

1.346 Beiträge seit 2008
vor 14 Jahren

Oder einen Singleton benutzen.

Gruß pdelvo

5.299 Beiträge seit 2008
vor 14 Jahren

Wennde 5 Tabellen im Typisierten Dataset hast, kriegste 5 TableAdapter generiert (die eiglich fabelhaft funktionieren, (Select-Command, Insert, Update, Delete + benutzerdefinierte Queries, incl. die passenden DBParameter, und korrekt gemappt auf die Dataset-Tabellen)).
Nur dass jeder für jedes Command-Objekt eine eigene Connection erstellt, anhand des inne Settings niedergelegten ConnectionStrings.

Der frühe Apfel fängt den Wurm.

S
80 Beiträge seit 2008
vor 14 Jahren
public static void ModifyConnectionString(string connectionString)  
        {  
            // Bitte Test.Properties.Settings.AdventureWorksConnectionString entsprechend Anpassen  
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
            config.ConnectionStrings.ConnectionStrings["Test.Properties.Settings.AdventureWorksConnectionString"].ConnectionString = connectionString;  
            config.Save(ConfigurationSaveMode.Modified);  
            ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);  
            Properties.Settings.Default.Reload();  
        }   
  

Die Funktion ModifyConnectionString() funzt gant gut. Leider habe ich das Problem, dass ich zwar zu jeder Zeit in meinem Programm den ConnectionString ändern kann (wird auch in die PROGRAMM.exe.Config geschrieben), so bald ich aber vorher schonmal mein DataSet gefüllt habe, werkelt das Programm mit dem alten ConnectionString weiter. Hab ich vorher noch keinen DB Connect gemacht, wird der geänderte String genommen.

Habe auch schon versucht nach dem ändern ein _connection.Close() zu machen, aber es hilft nix... Bitte helft mir!

Danke und Gruß,
sp00ky

5.299 Beiträge seit 2008
vor 14 Jahren

Kommt drauf an, wie du dein Dataset befüllst.
Durch Designer und Assistenten wird nahegelegt, generierte TableAdapter als Komponenten auf dem Form zu haben.
Wenn also das Form erstellt wird, sind auch die TableAdapter erstellt, und die haben sich ihren ConnenctionString aus der Config geholt, wie sie zum Zeitpunkt der Form-Instanzierung war.

Folgerung:
Form schließen, Config ändern, Form öffnen
oder
TableAdapter disposen, Config ändern, TableAdapter neu erstellen.

Der frühe Apfel fängt den Wurm.

B
375 Beiträge seit 2007
vor 13 Jahren

Was muss ich da als "using" deklarieren?
Denn ich habe VS2010 installiert und mir wird der ConfigurationManager in der Funktion ModifyConnectionString rot unterkringelt.

Geht das mit .Net 4.0 nicht mehr oder fehlt mir ein Verweis? thx

5.299 Beiträge seit 2008
vor 13 Jahren

gib einfach mal "ConfigurationManager" inne Suche des Hilfe-Index' ein. Näheres zu letzterem: Möglichkeiten der Informationsgewinnung

Der frühe Apfel fängt den Wurm.

D
5 Beiträge seit 2011
vor 12 Jahren

Hallo 😃

in meinem Programm wird vor dem laden der mainform geprüft ob in den properties in der Verbindungszeichenfolge etwas eingetragen ist. wenn nicht muss der user die Server Daten eingeben. das ganze habe ich versucht zu speichern nur bekomme ich die Fehlermeldung:

System.NullReferenceException: {"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}

die Methode zur Änderung hab ich hier aus dem thread:

public static void csb(string CS)
        {           
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
            config.ConnectionStrings.ConnectionStrings["LEB2011.Properties.Settings.Default.LEB2011ConnectionString"].ConnectionString = CS;
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);
            Properties.Settings.Default.Reload();            
        } 

hat jemand ne Idee was ich falsch mache?

Gruß
David

1.815 Beiträge seit 2005
vor 12 Jahren

Hallo!

Sorry, aber NullReferenceExceptions sind absolute Grundlagen: Einer der von dir verwendeten Variablen ist nicht instanziiert: Geh mit dem Debugger durch, und prüfe, was null ist.

Nobody is perfect. I'm sad, i'm not nobody 🙁

D
5 Beiträge seit 2011
vor 12 Jahren

Als ob ich das nich schon gemacht habe. Angeblich soll die config instanziert werden. das habe ich versucht bringt aber auch nur fehler.

als Verweis habe ich System.Configuration das sollte also auch nicht das Problem sein.

Ich habe sogar geschaut ob config oder cs Null ist. nein sind sie nicht.

S
1 Beiträge seit 2011
vor 11 Jahren

Hallo 🙂

in meinem Programm wird vor dem laden der mainform geprüft ob in den properties in der Verbindungszeichenfolge etwas eingetragen ist. wenn nicht muss der user die Server Daten eingeben. das ganze habe ich versucht zu speichern nur bekomme ich die Fehlermeldung:

System.NullReferenceException: {"Der Objektverweis wurde nicht auf eine Objektinstanz festgelegt."}

die Methode zur Änderung hab ich hier aus dem thread:

public static void csb(string CS)  
        {             
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);  
            config.ConnectionStrings.ConnectionStrings["LEB2011.Properties.Settings.Default.LEB2011ConnectionString"].ConnectionString = CS;  
            config.Save(ConfigurationSaveMode.Modified);  
            ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);  
            Properties.Settings.Default.Reload();              
        }   

hat jemand ne Idee was ich falsch mache?

Gruß
David

Hi@all,

es ist zwar jetzt wieder ein Jahr später, aber nachdem ich mich der gleichen Problematik widmen musste und ebenfalls mit der absoluten Grundlage der NullReferenceException zu kämpfen hatte, möchte ich meinen Schritt zur Fehlerbehandlung nicht vorenthalten (der nächste User wird sich evtl. freuen):

Problem bei mir war, dass bei dem Key kein 'Default' mit drin war, ich ihn aber so wie ihm Beispiel mit angegeben hatte ohne das vorher zu kontrollieren. Der korrekte Code würde z.B. lauten (ich nutze mal eben den von D.Steuck):


public static void csb(string CS)
        {           
            System.Configuration.Configuration config = ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);

// In nachfolgender Zeile zwischen Properties und Settings kein 'Default'
            config.ConnectionStrings.ConnectionStrings["LEB2011.Properties.Settings.LEB2011ConnectionString"].ConnectionString = CS;
            config.Save(ConfigurationSaveMode.Modified);
            ConfigurationManager.RefreshSection(config.ConnectionStrings.SectionInformation.Name);
            Properties.Settings.Default.Reload();            
        }

Vielleicht hilft es jemandem.

Gruß Saiwaa 🙂

FIAE-Azubi 3. Ausbildungsjahr -- C# seit Februar 2011