2009-06-19 5 views
7

Ich experimentiere einige Schwierigkeiten versuchen, Connection String Builders (ADO.NET) in LINQ to SQL zu verwenden. Lassen Sie mich euch zeigen, was ich versuche zu tun zu:Wie kann ich LINQ to SQL eine Verbindungszeichenfolge verwenden, die zur Laufzeit geändert wird?

die app.config Datei:

<?xml version="1.0" encoding="utf-8" ?> 
<configuration> 
    <configSections> 
    </configSections> 
    <connectionStrings> 
     <add name="LoremIpsum" 
      connectionString="Data Source=SomeServer;Initial Catalog=SomeDB;User ID=joe;" 
      providerName="System.Data.SqlClient" /> 
    </connectionStrings> 
</configuration> 

und ein Ausschnitt aus der Form:

ConnectionStringSettings settings = 
    ConfigurationManager.ConnectionStrings["LoremIpsum"]; 
if (null != settings) 
{ 
    string connection = settings.ConnectionString; 
    SqlConnectionStringBuilder builder = 
     new SqlConnectionStringBuilder(connection); 

    // passwordTextBox being the control where joe the user actually 
    // enters his credentials   
    builder.Password = passwordTextBox.Text; 
} 

LINQTOSQLDataClassDataContext db = new LINQTOSQLDataClassDataContext(); 

// finally some rather anecdotic LINQ sentence here: 
var foo = db.Table.Single(bar => bar.Table == whatever); 

O n die andere Seite der Überprüfung das Direkt-Fensters:

?builder.ConnectionString 
"Data Source=SomeServer;Initial Catalog=SomeDB;User ID=joe;Password=swordfish" 

Ich bin immer eine Ausnahme bekommen: Fehler bei der Anmeldung für den Benutzer ‚joe‘. Irgendwelche Ideen? Vielen Dank im Voraus.

+0

Fehlt Ihnen der Code, der tatsächlich die neue Verbindungszeichenfolge verwendet? Auch, warum ist das ein Wiki? –

+2

Dies sollte kein Community-Wiki sein. – jason

+0

Einverstanden ... vollkommen gute Frage. – Kev

Antwort

10

Es scheint, wie Sie versuchen, die Verbindungszeichenfolge zu ändern, die in der app.config-Datei gespeichert ist. Wenn Sie einen Konstruktor ohne Argumente für Ihren Datenkontext verwenden, liest er, was zur Entwurfszeit konfiguriert wurde.

Versuchen Sie modifizierte Verbindungszeichenfolge in den Konstruktor der Datacontext-Injektion:

ConnectionStringSettings settings = ConfigurationManager.ConnectionStrings["LoremIpsum"]; 
SqlConnectionStringBuilder builder; 
LINQTOSQLDataClassDataContext db; 

if (null != settings) 
{ 
    string connection = settings.ConnectionString; 
    builder = new SqlConnectionStringBuilder(connection); 

    // passwordTextBox being the control where joe the user actually enters his credentials 

    builder.Password =passwordTextBox.Text; 
    db = new LINQTOSQLDataClassDataContext(builder.ConnectionString); 
} } 
+0

Vielen Dank Ihr Rat CleverCoder! –

6

Sie vergessen, die Verbindungszeichenfolge an den DataContext-Konstruktor zu senden.

Beispiel:

LINQTOSQLDataClassDataContext db = new LINQTOSQLDataClassDataContext(builder.ConnectionString); 
+1

Danke für deinen Kommentar Marpe! Es ist durchaus möglich, dass ich das wahrscheinlich vergesse. Würde es Ihnen etwas ausmachen, ein Beispiel zu geben, wie es geht? –

+0

Ah, ich habe gerade in den alten Revisionen Ihrer Frage gelesen, was Ihr Problem war. Ihr letzter Satz scheint ausgeschnitten zu sein - der eine, der sagt: "Ich bekomme immer eine Ausnahme: Login für Benutzer 'joe' fehlgeschlagen". Der Grund dafür ist, dass, wenn Sie die neu erstellte Verbindungszeichenfolge nicht angeben, der von Ihnen verwendete Datenkontextkonstruktor direkt zur ConfigurationManager.ConnectionStrings-Auflistung und wählen Sie die in der DBML-Datei (und in Ihrem wenn Sie kein Passwort für Joe in der Konfig gespeichert haben). – Ostemar

+0

Übergeben Sie es einfach an den Konstruktor als: LINQTOSQLDataClassDataContext db = neue LINQTOSQLDataClassDataContext (builder.ConnectionString); – Ostemar

4

Sie eine DataContext zwingen kann, mit

DataContext db = new DataContext(myConnectionString); 

Der parameterlos DataContext Konstruktor eine spezifische Verbindungszeichenfolge zu verwenden, wird ein verwenden Verbindungszeichenfolge aus der Datei App.config zuerst, dann die Verbindungszeichenfolge zur Kompilierzeit festgelegt.

Verwandte Themen