Autor Beitrag
Nick33
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 11.06.09 19:44 
Hallo an alle!

Ich arbeite an einer C#-Anwendung, die mittels Linq an einen MS SQL-Server 2005 angebunden ist. Um diese Anbindung flexibel zu gestallten, kann ich den ConnectionString nicht wie gewohnt fest eintragen. (public static DataClasses1DataContext _db = new DataClasses1DataContext(@"Data Source=Servername\Server2005;Initial Catalog=Datenbankname;Persist Security Info=True;User ID=User1;Password=Beispiel"); ) Ich hinterlege deshalb diesen ConnectionString in einem cfg-File und lese diesen in meiner Anwendung wieder aus:

FileStream MyFileStream = new FileStream(@"C:\DBconnect\connection.cfg", FileMode.Open, FileAccess.Read, FileShare.None);
StreamReader sr = new StreamReader(MyFileStream);
string connection = sr.ReadLine();

Jetzt wollte ich diese Stringvariable dem DataContext übergeben:
public static DataClasses1DataContext _db = new DataClasses1DataContext(connection);

Dabei entstehen jedoch "Escaping-Fehler" (...wenn ich das mal so nennen darf...)
Beim debuggen steht in connection:
@\"Data Source=Servername\\Server2005;Initial Catalog=Datenbankname;Persist Security Info=True;User ID=User1;Password=Beispiel\");

Ich hab mal testweise connection dem Clipboard übergeben und dann den Speicherinhalt in ein .txt ausgelesen. Dabei gab er mit den ConnectionString sauber wieder, aber übergebe ich die Variable sebst dem DataContext ist der ConnectionSting stets "unsauber".

Das Escapen mit:
public static DataClasses1DataContext _db = new DataClasses1DataContext(@connection);
...funktioniert so nicht. DataContext erwartet nach dem @ einen String in "".

Hat jemand von Euch eine Idee, wie ich dem DataContext meinen "sauberen" ConnectionString in Form einer Variablen übergeben kann? Ich bin über jeder Hilfe dankbar, denn langsam bin ich mit meinem Latein gänzlich am Ende. Ich mag mir nicht vorstellen wollen, dass meine Aufgabe jetzt an diesem letzten String scheitern soll. Ich danke Euch schon mal!
JüTho
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 2021
Erhaltene Danke: 6

Win XP Prof
C# 2.0 (#D für NET 2.0, dazu Firebird); früher Delphi 5 und Delphi 2005 Pro
BeitragVerfasst: Do 11.06.09 20:25 
Hallo und :welcome:

Der ConnectionStringBuilder funktioniert doch wohl auch bei DataContext, oder?

Übrigens: Oben unter "Bereiche" gibt es eine ComboBox für C# und daneben einen Plus-Button; damit kannst du deinen Code markieren. Das liest sich erheblich besser, auch wenn es sich um jeweils nur drei Zeilen handelt.

Textdateien lassen sich einfacher mit File.ReadXxx einlesen. StreamReader und Verwandte benötigen Close und Dispose (oder using-Block), all das fehlt bei dir.

Wenn dein ConnectionString mit "@\" beginnt, machst du dort wohl einen Fehler. Der Parameter beim DataContext-Aufruf verlangt entweder einen String mit Gänsefüßchen (ggf. mit @ davor) oder einen Variablennamen, aber keinen Mischmasch.

Gruß Jürgen
Nick33 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 11.06.09 21:34 
Hallo Jürgen!

Danke für den freundlichen Empfang und Deiner superschnelle Antwort!

Von diesem ConnectionStringBuilder wusste ich bisher nichts. Ich hab mir selber eine Lösung gebastelt und jetzt festgestellt, dass diese dem ConnectionStringBuilder stark gleicht. Der einzigste Unterschied: Der ConnectionStringBuilder speichert den String in einer .txt, statt wie meine Lösung in .cfg und definiert und deklariert darin gleich die Stringvariable. Ich hatte bei mir nur den reinen ConnectionString drin gespeichert. Der gedankliche Ansatz ist der gleiche. Könntest Du mir evtl. helfen, den generierten und in diesen txt-File gespeicherten ConnectionString in richtiger fehlerfreien Syntax in meinem DataContext zu integrieren?
Mein Problem scheint im Auslesen der Information aus diesem txt-File, bzw. einfach nur in der Übergabe zu liegen. Wie vorhin geschrieben, bekomme ichs nicht hin, dass der String sauber ins DataContext übergeben wird. Es wird beim Auslesen oder Übergeben stets der Backslash zwischen Server und Serverinstanz verdoppelt, sowie ein Backslash nach dem @ und eins am Ende vor dem schließenden Anführungszeichen eingefügt. Das Problem sollte doch mit einem davor geschriebene @ zu beseitigen sein, weil dies doch die Verdopplung eines Backslashs verhindert, oder? Aber wie Du ja eben auch geschrieben hast, geht entweder: @"...<String>...", oder die Übergabe einer Variablen ohne @! Ich muss es mit dieser Variablen lösen, nur diese ist stets durch die zusätzlichen Backslashes verfälscht.

Gruß mit besten Dank
Nick
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 11.06.09 21:54 
:welcome:
user profile iconNick33 hat folgendes geschrieben Zum zitierten Posting springen:
Dabei entstehen jedoch "Escaping-Fehler" (...wenn ich das mal so nennen darf...)
Beim debuggen steht in connection:
Das ist doch nur der Debug Visualizer :D . In der Variablen selbst steht der korrekte String drin.
Deine selbstgestrickte cfg-Lösung ist aber sowieso unnötig: Der Linq2SQL-Designer sollte automatisch in die Settings.settings einen "(Connection string)"-Wert einfügen, im Standardkonstruktor der DataContext-Klasse steht dann bei mir z.B.:
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
    public DataClasses1DataContext() : 
        base(global::ConsoleApplication1.Properties.Settings.Default.NorthwindConnectionString, mappingSource)
    {
      OnCreated();
    }

_________________
>λ=
Nick33 Threadstarter
Hält's aus hier
Beiträge: 3



BeitragVerfasst: Do 11.06.09 23:06 
Hallo Kha!

Danke für Deine Antwort!

Mein Problem ist ja folgendes:
Ich erstelle eine Anwendung, definiere im DataContext die Verbindung zu meinem lokalem auf meinem Rechner im Hintergrund laufendem SQL_Server und (wenn nicht Windows-Authentifikation) mit meiner User-ID und Passwort und der dort erstellten Datenbank. Ich schließe die Erstellung meiner Anwendung ab und bastel eine Setupdatei. Wenn ich diese Setupdatei dir zusende,du sie bei dir installiert und ausführen willst, stimmen die Angaben im ConnectionString nicht mehr, dein lokaler Server wird nicht gefunden und meine Anwendung wird bei dir nie laufen. Jetzt war mein Ziel, den ConnectionString nicht fest reinzuschreiben, sondern als Variable zu übergeben, die ihre Informationen von einem externen File bekommt, in dem vorher die aktuellen Parameter deines lokalen Servers, Instanz, User-ID, Passwort usw. durch ein kleines Tool gespeichert wurden.
Denke ich völlig schief und/oder gibt es vielleicht eine andere, bzw. einfachere Lösung?
Ich hab mal in meiner Settings.settings geschaut. Ich finde darin ja noch sämtliche vorherigen Connections zu meinen alten DBs. Werden diese Files nicht automatisch durch den Wizard generiert, wenn ich die Tabellen vom Server-Explorer in die DataClasses ziehe (genau wie diese App.config)? Ist dann aber nicht die Datenbankverbindung wieder statisch und unanpassbar?

Helf mir mal auf die Sprünge und danke für deine Mühe!

Gruß Nick
Kha
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 3803
Erhaltene Danke: 176

Arch Linux
Python, C, C++ (vim)
BeitragVerfasst: Do 11.06.09 23:23 
user profile iconNick33 hat folgendes geschrieben Zum zitierten Posting springen:
Werden diese Files nicht automatisch durch den Wizard generiert, wenn ich die Tabellen vom Server-Explorer in die DataClasses ziehe (genau wie diese App.config)?
Eben. Die App.config landet dann als DeineExe.exe.config im Anwendungsverzeichnis, wo sie dann der Admin anpassen kann.
Allerdings ist das Anwendungsverzeichnis ja normalerweise schreibgeschützt, wenn also dein Programm selbst den Connection String anpassen soll, würde ich eher einen neuen Settings-Eintrag vom Typ String anlegen, den kannst du dann nämlich auch im Code ohne Admin-Rechte ändern.

_________________
>λ=