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.
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
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?
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
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.
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
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.
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
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
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
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
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.
Hi, falls ihr einen vorhanden ConnectionString zur Laufzeit verändern möchtet,
bietet sich hierzu die Klasse SqlConnectionStringBuilder an.
...
Mit Dank an
>
und hier das ganze auf deutsch 😉 mit weiterführenden Links:
http://msdn.microsoft.com/de-de/library/ms134265.aspx
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
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.
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ß.
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.
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.
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
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.
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
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.
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
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 🙁
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.
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