Autor Beitrag
Talemantros
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: So 06.04.14 22:10 
Hallo,
ich habe über Visual Studio meinem Projekt eine "Server.mdf" hinzugefügt und diese über den Designer mit Eigenschaften und Spalten gefüllt.
Der ConnectionString, der vom VS2013 erzeugt wurde sieht so aus:

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
<configuration>
    <configSections>
    </configSections>
    <connectionStrings>
        <add name="Recycle.Properties.Settings.serverConnectionString"
            connectionString="Data Source=(LocalDB)\v11.0;AttachDbFilename=|DataDirectory|\server.mdf;Integrated Security=True;Connect Timeout=30"
            providerName="System.Data.SqlClient" />
    </connectionStrings>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
</configuration>


Nun bekomme ich, wenn ich über ein UserControl Daten daraus abrufen will, die im Anhang gezeigte Fehlermeldung, obwohl zur Laufzeit des Programms alles funktioniert.

Leider kann ich dies nicht ganz zuordnen. Wie am Ende von www.entwickler-ecke....ewtopic.php?t=112853 erklärt habe ich aus |DataDirectory| den absoluten Pfad zur Datenbank auf meinem Laufwerk gemacht und der Fehler ist weg.

Nun habe ich mit dem festen Pfad aber das Problem, dass er nach dem "Bereitstellen" der Anwendung für andere Benutzer immer nach dem Pfad zur Datenbank sucht, der aber bei anderen nicht vorhanden ist und nicht die Server.mdf nimmt die im Programmverzeichnis der Anwendung liegt.

In der Fehlermeldung bemängelt er 3 Methoden, die ich mir näher angeschaut habe aber leider nicht wüsste was ich da ändern kann/soll

1.) Zeile 29 von VerbindngDatenbankUserControl holt er sich "options = ConnectionOptionsMethods.GetConnectionOptions();
2.) Zeile 17 aus ConnectionOptionsMethods steht:

ausblenden C#-Quelltext
1:
2:
3:
4:
return new ConnectionOptions(LocalDbQuery.GetOptions(connStr, 12),
                                         LocalDbQuery.GetOptions(connStr, 22),
                                         LocalDbQuery.GetOptions(connStr, 32),
                                         LocalDbQuery.GetOptions(connStr, 42));


3.) Zeile 17 aus LocalDbConnect öffnet er die lokale db mit "conn.open()";

Kann mir irgendwer sagen was ich machen muss?

Danke

Gruß
Einloggen, um Attachments anzusehen!
Th69
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Moderator
Beiträge: 4764
Erhaltene Danke: 1052

Win10
C#, C++ (VS 2017/19/22)
BeitragVerfasst: Mo 07.04.14 09:40 
Hallo,

sorry, daß ich dich mit den UserControls in solche Fehler hab laufen lassen. ;-)

Nein, das wusste ich leider auch nicht, aber über Recherche bin ich auf VS 2008, WinForms Designer, UserControl and DataDirectory sowie Visual Studio 2005, WinForms designer and the DataDirectory. gestoßen (scheint wohl immer noch aktuell zu sein).

Du solltest also versuchen, zu verhindern, daß im Designer dein Datenbankzugriff ausgeführt wird. Beachte, daß die Eigenschaft IsDesignMode so einige Tücken hat (sie funktioniert nicht im Konstruktor, sondern nur im Load-Ereignis). Unter Detecting design mode from a Control's constructor gibt es einige Alternativen.
Talemantros Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 444
Erhaltene Danke: 2

Win7 Proff 64bit
C# (VS2013)
BeitragVerfasst: Mo 07.04.14 10:35 
Hi TH69,
absolut kein Problem.
Klar ist es schade, jetzt irgendwie gefühlt wieder nicht weiter zu kommen, aber aus Fehlern lernt man und durch diesen hier habe ich schon wieder Ecken gesehen, die vorher nicht kannte.
Also im großen und ganzen versuche ich es positiv zu sehen.

Habe mal einiges von deinen Anregungen gelesen und eine versucht bisher umzusetzen.

ausblenden C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
        private void VerbindungDatenbankUserControl_Load(object sender, EventArgs e)
        {
            if (LicenseManager.UsageMode == LicenseUsageMode.Designtime)
            {
                // design mode
            }
            else
            {
                if (options != null)
                    options.ModifiedChanged -= options_ModifiedChanged;

                options = ConnectionOptionsMethods.GetConnectionOptions();
                options.ModifiedChanged += options_ModifiedChanged;

                connectionOptionsBindingSource.DataSource = options;
            }
        }


Allerdings noch ohne Erfolg.
Probiere mein Glück weiter.

Wenn du noch Ideen hast immer gern :-D

Gruß

EDIT:
Lt. connect.microsoft.co...rrect-at-design-time
Ist es ein Fehler der vom ADO.NET kommt und angeblich nicht von Microsoft im VS nachgestellt werden kann.

Eigentlich könnte ich es ja auch so lassen auch wenn es unschön ist, aber laufen zur Laufzeit tut es ja. hmm :-(

Edit2:
Also jetzt wo ich weiß, wie der Fehler entsteht halte ich mich glaube nicht länger damit auf.

Ich habe nun die Einstellungen für den ConnectionString gelöscht und meine Klasse, die diesen zurück gibt geändert und den festen Pfad zur Datenbank eingegeben.

ausblenden C#-Quelltext
1:
2:
            return @"Data Source=(LocalDB)\v11.0;AttachDbFilename=E:\Dropbox\Dropbox\Projekte\rEcycle\rEcycle\server.mdf;Integrated Security=True;Connect Timeout=30";
            //return Recycle.Properties.Settings.Default.serverConnectionString;    DAS WARS VORHER


Und bevor ich es irgendwann mal wem gebe ändere ich dies dann einfach auf

ausblenden C#-Quelltext
1:
2:
3:
4:
         public static string GetConnStrOptions()
         {
            return @"Data Source=(LocalDB)\v11.0;AttachDbFilename=" + Application.StartupPath + @"\server.mdf;Integrated Security=True;Connect Timeout=30";
         }


Ist sicher nicht die schönste Art, aber wenn euch nicht auch noch was leichtes einfällt denke ich die angenehmste um erst mal weiter zu programmieren.

Viele Grüße