Autor Beitrag
m-s
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Do 17.03.11 14:54 
Hallo Zusammen,

ich stehe auf'm Schlau.
Ich habe schon verschiedene Ansätze verfolgt und bekomme es trotzdem nicht hin.

Ich möchte eine Datenbankdatei auf den ZielRechnern in einem Unterverzeichnis des jeweiligen Userverzeichnis haben. Die Datenbank dahin kopieren ist ja kein Problem, das macht das Setup, aber wie überrede ich den Connectionstring zur richtigen Arbeit :)

Ich habe die Datenbank mit einem Dataset / Tableadapter usw. in mein Programm eingebungen und dort muss man Feste Pfade angeben. Ich möchte aber sowas wie:

ausblenden C#-Quelltext
1:
Environment.GetFolderPath(Environment.SpecialFolder.UserProfile) + "\\tollesProgramm\\MyDataBase.mdf";					


verwenden. anscheinend gibt es keinen Weg das direkt so in VS zu hinterlegen. Kann mir jemand sagen wie ich vorgehen muss?
Alle bisherigen Anleitungen im Web wollten sich mir nicht erschließen.

Gruß Markus
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 17.03.11 15:41 
Wenn du dir im Datasetdesigner mal deine Tableadapter ansiehst wirst du sehen das die eine ConnectionModifier Property haben. Setzte die auf public dann kannst du zur Laufzeit die Connectionstring Property sehen und vor der Benutztung eben auch passend setzen.

Alternativ kannst du auch dem Tableadapter eine eigene Basisklasse unterjubeln (Die Baseclass Property die du auch im DatasetDesigner an den Tableadaptern siehst) und dort den Connectionstring/die Connection per Reflection zur Laufzeit austauschen.
Trashkid2000
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 561
Erhaltene Danke: 137



BeitragVerfasst: Do 17.03.11 16:28 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Alternativ kannst du auch dem Tableadapter eine eigene Basisklasse unterjubeln (Die Baseclass Property die du auch im DatasetDesigner an den Tableadaptern siehst) und dort den Connectionstring/die Connection per Reflection zur Laufzeit austauschen.

Eine andere Möglichkeit wäre auch einfach, für den TableAdapter eine partielle Klasse zu erstellen, über die Du dann die Connection setzen kannst (z.B. auch über einen eigenen Konstruktor). Das mit der partiellen Klasse macht sich ganz gut, denn so kannst Du auch auf Reflection verzichten, und auch noch mehr Funktionalität mit reinbringen (wie z.B. Transktionskontrolle...).
Marko
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 17.03.11 16:37 
Zitat:
Das mit der partiellen Klasse macht sich ganz gut, denn so kannst Du auch auf Reflection verzichten, und auch noch mehr Funktionalität mit reinbringen (wie z.B. Transktionskontrolle...).


Bei Tableadaptern leider nein. Die sind ja erstmal von nix abgeleitet(Es gibt keine Tableadapter Klasse von der dir Tableadapter ableiten). Man müsste dann für jeden konkreten Tableadapter eine partielle Klasse schreiben da ist eine Basisklasse dann vermutlich doch übersichtlicher.
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Do 17.03.11 17:48 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Wenn du dir im Datasetdesigner mal deine Tableadapter ansiehst wirst du sehen das die eine ConnectionModifier Property haben. Setzte die auf public dann kannst du zur Laufzeit die Connectionstring Property sehen und vor der Benutztung eben auch passend setzen.

Hallo Ralf,

also die Property ConnectionModifier habe ich gefunden, aber wie weiter habe ich keine Vorstellung.
Ich weiß nicht mal im Ansatz wo ich den ConnectionString herholen oder hinschreiben soll.

Kannst Du das noch etwas deutlich machen?

Gruß Markus
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: Do 17.03.11 18:44 
Zitat:
Ich weiß nicht mal im Ansatz wo ich den ConnectionString herholen oder hinschreiben soll.


Irgendwoher holen und in MeinLieberTableadapter.ConnectionString schreiben. Wo du denn statischen Teil des Connectionstrings herholst(um in dann um denn konkreten Pfad zu ergänzen) ist egal. Denk dir was passendes aus (App.Config, irgendeine Settingsdatei, hart codiert im Source etc. - alle Wege funktionieren).

Für diesen Beitrag haben gedankt: m-s
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Do 17.03.11 19:24 
Hallo Ralf,

ja da habe ich wohl viel zu kompliziert gedacht, war ja wirklich einfach.
Ich frage mich warum das im Netz immer so kompliziert beschrieben ist.

Ich habe einfach im Konstruktor nen neuen Connectionstring gebaut und den dem TableAdapter zugewiesen.

Ist so einfach das ich mir nicht sicher bin obs überhaupt richtig ist :)
Aber es funktioniert.

Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Sa 30.06.12 20:19 
Ich habe mal wieder das "gleiche" Problem.
In diesem Fall suche ich aber eine Lösung, die den Connectionstring für alle Forms und Tableadapter der Anwendung ändert.

Eigentlich würde ich gerne in die app.config schreiben

ausblenden C#-Quelltext
1:
connectionString="Data Source=%userprofile%\TollesProgramm\tolle.sdf"					


Aber das funktioniert ja nicht.
Wie kann ich denn für die ganze Anwendung den Connectionstring für den jeweiligen Rechner anpassen? Also ausgehend davon, dass die Datenbank immer im entsprechenden Userverzeichnis liegt.

_________________
Gruß Markus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 01.07.12 09:59 
Hallo Markus,

was genau soll nicht mit der "app.config" funktionieren?

Wenn es dir um das Ersetzen der Environment-Variablen (%userprofile%) geht, so kannst du dafür die Environment.ExpandEnvironmentVariables-Methode benutzen.
Ralf Jansen
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 4708
Erhaltene Danke: 991


VS2010 Pro, VS2012 Pro, VS2013 Pro, VS2015 Pro, Delphi 7 Pro
BeitragVerfasst: So 01.07.12 11:45 
Du kannst im ConnectionString mit |DataDirectory| arbeiten. Die DataDirectory kannst du dann zur Laufzeit via AppDomain.SetData einmal passend setzen.

Am vermutlich besten wäre aber immer noch der in Beitrag 2 vorgeschlagene Weg einer eigenen Basisklasse für deine Tableadapter. Das gibt dir das größte Mass an Freiheit für eine an deine Anwendungsanforderungen angepasste Lösung. Bedenke eine Lösung die zur Laufzeit irgendwas im Connectionstring austauscht würde zur Designzeit nicht ziehen.
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: So 01.07.12 13:59 
user profile iconTh69 hat folgendes geschrieben Zum zitierten Posting springen:
Hallo Markus,

was genau soll nicht mit der "app.config" funktionieren?

Wenn es dir um das Ersetzen der Environment-Variablen (%userprofile%) geht, so kannst du dafür die Environment.ExpandEnvironmentVariables-Methode benutzen.

Hallo Th69,

Soweit ich das verstanden habe, kann man in der app.config entweder einen reellen Pfad angeben, also c:\irgendwas\toll.mdf oder mit der Variablen |DataDirectory| was machen. Diese scheint aber das Verzeichnis zu meinen in dem die exe gestartet wird.
Was ich brauche ist eine Variable die ich in der app.config verwenden kann, die das %userprofile" zurück gibt.
Im normalen Code kann ich Environment.ExpandEnvironmentVariables("%userprofile%") verwenden, in der app.config bekomme ich für:

ausblenden C#-Quelltext
1:
connectionString="Data Source=Environment.ExpandEnvironmentVariables("%userprofile%") + @"\tollesprogramm\tolle.sdf"					


den Fehler
Zitat:
"Fehler 1 Das Zeichen '%', Hexadezimalwert 0x25, ist in einem XML-Namen nicht zulässig."

Benutze ich es falsch, oder hatte ich mich vorher schlecht ausgedrückt?

_________________
Gruß Markus
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: So 01.07.12 14:05 
user profile iconRalf Jansen hat folgendes geschrieben Zum zitierten Posting springen:
Du kannst im ConnectionString mit |DataDirectory| arbeiten. Die DataDirectory kannst du dann zur Laufzeit via AppDomain.SetData einmal passend setzen.

Am vermutlich besten wäre aber immer noch der in Beitrag 2 vorgeschlagene Weg einer eigenen Basisklasse für deine Tableadapter. Das gibt dir das größte Mass an Freiheit für eine an deine Anwendungsanforderungen angepasste Lösung. Bedenke eine Lösung die zur Laufzeit irgendwas im Connectionstring austauscht würde zur Designzeit nicht ziehen.

|DataDirectory| gibt den Pfad wieder in dem die exe gestartet wird, richtig?
Das würde mir ja erst mal nicht nützen.
AppDomain.SetData habe ich versucht in der Hilfe zu finden aber die Informationen bringen mich nicht weiter. Sind einfach zu knapp als das ich verstehe worum es geht.

Ich glaube ich hatte die Frage auch zu knapp formuliert.
Wie ich einen Tableadapter starten kann, hatte ich ja gemacht, aber eben war in der Anwendung ein Form und ein Tableadapter.
Nun habe ich 20 Forms und etliche Tableadapter. Ich dachte ich könnte den Connectionstring in der app.config ändern, damit das komplette DataSet den neuen Pfad verwendet und ich nicht in jede Form gehen muss und einen neuen Connectionsstring für jeden Tableadapter zu setzen.

Den Satz aus dem zweiten Post werde ich mal noch 20 mal lesen und hoffen das ich ihn Stück für Stück verstehen kann :)
Alles gar nicht so einfach ...

_________________
Gruß Markus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: So 01.07.12 14:34 
Hallo Markus,

ich meinte das natürlich im Code.
Aber dann müßtest du jeweils die Eigenschaft Connection der vom Designer erzeugten TableAdapter zuweisen (aber das scheinst du ja gerade nicht zu wollen - habe erst jetzt deinen gesamten Beitrag gelesen).

Und mit dem DataDirectory scheint das aber sehr einfach zu sein, s. Set the directory (connection string) for an SQL Server Database Connection
ausblenden C#-Quelltext
1:
2:
3:
4:
5:
void Form_Load(object sender, EventArgs e)
{
    // Set the db directory to the common app data folder
    AppDomain.CurrentDomain.SetData("DataDirectory", System.Environment.GetFolderPath(System.Environment.SpecialFolder.UserProfile));
}

Statt in Form_Load kannst du das selbstverständlich auch schon in der Program.Main ausführen.

Für diesen Beitrag haben gedankt: m-s
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Fr 06.07.12 16:46 
Hallo Th69,

super danke.
Ich habe den Code jetzt in der program.cs (Program.main habe ich nicht gefunden). Dort im Teil

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
    static class Program
    {
        /// <summary>
        /// Der Haupteinstiegspunkt für die Anwendung.
        /// </summary>
        [STAThread]
        static void Main()
        {
           Hier
        }


Bevor irgendwas anderes geladen wird.
Scheint zu funktionieren

_________________
Gruß Markus
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4796
Erhaltene Danke: 1059

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Fr 06.07.12 18:17 
Hallo Markus,

schön, daß es so funktioniert.
Und mit Program.Main meinte ich exakt die Main-Methode in der 'program.cs'-Datei ;-)
m-s Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 149
Erhaltene Danke: 7

Win 10
C# (VS 2015)
BeitragVerfasst: Sa 07.07.12 02:20 
:) Na ist ja super das ich ahnungsloser aus versehen die richtige Stelle gefunden habe. :)
program.cs hatte ich bisher gar nicht auf dem Plan. Muss ich mir wohl auch mal ansehen was man da so alles sinnvoll machen kann.

Jedenfalls erst mal ein Problem weniger, danke.

_________________
Gruß Markus