2009-06-19 5 views
7

Sto sperimentando alcune difficoltà nel tentativo di utilizzare Connection String Builders (ADO.NET) all'interno di LINQ to SQL. Mi permetta di mostrare voi ragazzi quello che sto cercando di fare:Come posso fare in modo che LINQ to SQL usi una stringa di connessione che viene modificata in fase di runtime?

il app.config di 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> 

e un frammento della forma:

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 D'altra parte il controllo della finestra immediata:

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

sto ottenendo sempre un'eccezione: Accesso non riuscito per l'utente 'Joe'. Qualche idea? Grazie mille in anticipo.

+0

Ti manca il codice che utilizza effettivamente la nuova stringa di connessione? Inoltre, perché questo è un wiki? –

+2

Questo non dovrebbe essere un wiki della comunità. – jason

+0

Concordato ... perfettamente una buona domanda. – Kev

risposta

10

Sembra che si sta tentando di modificare la stringa di connessione che viene memorizzata nel file app.config. Quando si utilizza un costruttore senza argomenti per il contesto dati, viene letto ciò che è stato configurato in fase di progettazione.

Prova iniettando la stringa di connessione modificato al costruttore del 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

Grazie mille del tuo consiglio CleverCoder! –

6

Si sta dimenticando di inviare il connectiontring al costruttore DataContext.

Esempio:

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

Grazie per il tuo commento Marpe! È probabile che probabilmente lo dimenticherò. Ti dispiacerebbe dare un esempio di come farlo? –

+0

Ah, ho appena letto nelle vecchie revisioni della tua domanda quale fosse il tuo problema. La tua ultima frase sembra essere stata tagliata - quella che dice: "Ricevo sempre un'eccezione: Login fallito per l'utente 'joe'". Il motivo è perché se non si fornisce la stringa di connessione appena creata, la funzione di costruzione datacontext che si sta utilizzando andrà direttamente alla raccolta ConfigurationManager.ConnectionStrings e selezionerà quella specificata nel file DBML (e nel nel caso in cui non si abbia la password per Joe memorizzata nella configurazione). – Ostemar

+0

Basta passarlo al costruttore come: LINQTOSQLDataClassDataContext db = new LINQTOSQLDataClassDataContext (builder.ConnectionString); – Ostemar

4

È possibile forzare un DataContext di utilizzare una stringa di connessione specifica con

DataContext db = new DataContext(myConnectionString); 

Il costruttore senza parametri DataContext userà un stringa di connessione dal file App.config, quindi la stringa di connessione impostata in fase di compilazione.

Problemi correlati