2009-06-19 5 views
7

Eksperymentuję z pewnymi trudnościami próbującymi użyć Connection String Builders (ADO.NET) w LINQ do SQL. Pokażę ci faceci, co usiłuję zrobić:Jak utworzyć LINQ do SQL użyć ciąg połączenia, który jest modyfikowany w czasie wykonywania?

app.config file:

<?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> 

i urywek postaci:

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 Z drugiej strony sprawdzenie Okienko bezpośrednie:

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

zawsze jestem coraz wyjątek: Logowanie nie powiodło się dla użytkownika „joe”. Jakieś pomysły? Z góry dziękuję.

+0

Brakuje kodu, który faktycznie używa nowego ciągu połączenia? Ponadto, dlaczego jest to wiki? –

+2

To nie powinno być wiki społeczności. – jason

+0

Uzgodnione ... doskonałe pytanie. – Kev

Odpowiedz

10

Wydaje się, że staramy się zmodyfikować ciąg połączenia, który jest przechowywany w pliku app.config. Kiedy używasz konstruktora bez argumentów dla kontekstu danych, to odczytuje to, co zostało skonfigurowane w czasie projektowania.

Spróbuj wstrzykując swój zmodyfikowany ciąg połączenia do konstruktora DataContext:

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

Dziękuję za waszą radę CleverCoder! –

6

Zapominasz o wysłaniu połączenia do konstruktora DataContext.

Przykład:

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

Dzięki za komentarz Marpe! Jest całkiem możliwe, że prawdopodobnie o tym zapomnę. Czy mógłbyś dać przykład, jak to zrobić? –

+0

Ah, właśnie czytałem w starych wersjach twojego pytania, jaki był twój problem. Wydaje się, że ostatnie zdanie zostało wycięte - ten, który mówi: "Zawsze otrzymuję wyjątek: Logowanie nie powiodło się dla użytkownika" joe "". Przyczyna jest taka, ponieważ jeśli nie podasz nowo utworzonego ciągu połączenia, konstruktor datacutext, którego używasz, przejdzie bezpośrednio do kolekcji ConfigurationManager.ConnectionStrings i wybierze plik określony w pliku DBML (oraz w pliku w przypadku, gdy nie masz hasła do Joe zapisanego w konfiguracji). – Ostemar

+0

Po prostu prześlij go do konstruktora jako: LINQTOSQLDataClassDataContext db = new LINQTOSQLDataClassDataContext (builder.ConnectionString); – Ostemar

4

można wymusić DataContext do korzystania z konkretnego ciąg połączenia z

DataContext db = new DataContext(myConnectionString); 

konstruktor bez parametrów DataContext użyje najpierw ciąg połączenia z pliku App.config, a następnie ciąg połączenia ustawiony podczas kompilacji.