2009-03-20 10 views
2

J'ai un système qui prend en charge plusieurs produits. Chaque produit a sa propre base de données avec le même schéma exact. Lorsque je passe la chaîne de connexion en paramètre à mon constructeur de contexte de données, il utilise toujours la base de données par défaut listée dans la chaîne de connexion ou la base de données par défaut de l'utilisateur si je ne fournis pas de catalogue initial dans la connexion chaîne. Je voudrais pouvoir faire en sorte que le système utilise une base de données sans avoir à changer la chaîne de connexion et en passant le nom de la base de données comme paramètre.Base de données LINQ

Voici un exemple du code que je utilise:

class Program 
    { 
     static void Main(string[] args) 
     { 
      var d = new Data("Data Source=(LOCAL);Initial Catalog=Database1;Integrated Security=true;"); 

      var d1 = new Data("Data Source=(LOCAL);Initial Catalog=Database2;Integrated Security=true;"); 

      Console.ReadLine(); 
     } 
    } 

    internal class Data 
    { 
     public Data(string connection) 
     { 

      using (var ctx = new DataClassDataContext(connection)) 
      { 
       var query = from c in ctx.MyTable select c; 
       try 
       { 
        Console.WriteLine(query.Count()); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 



      } 
     } 
    } 

Si ce code est exécuté, le premier résultat va tirer de Database1 et le second résultat va tirer de Database2. Je voudrais qu'il puisse tirer d'une base de données qui n'est pas fournie dans la chaîne de connexion. La raison en est que la base de données peut changer en fonction d'un scénario spécifique, mais la chaîne de connexion restera la même.

Voici un exemple de ce que je me sers de « faux », mais je ne pense pas vraiment que c'est la meilleure solution pour cela:

class oConnection 
    { 
     public string Server { get; set; } 
     public string Database { get; set; } 
     public bool IntegratedSecurity { get; set; } 
     public string UserName { get; set; } 
     public string Password { get; set; } 
    } 

    class Program 
    { 
     static void Main(string[] args) 
     { 
      var d = new Data(new oConnection 
           { 
            Database = "Database1", 
            Server = "(Local)", 
            IntegratedSecurity = true 
           }); 

      var d1 = new Data(new oConnection 
            { 
             Database = "Database2", 
             Server = "(Local)", 
             IntegratedSecurity = true 
            }); 
      Console.ReadLine(); 
     } 
    } 

    internal class Data 
    { 
     private static string BuildConnection(oConnection connection) 
     { 
      var sb = new StringBuilder(); 
      sb.Append("Data Source=" + connection.Server + ";Initial Catalog=" + connection.Database + ";"); 
      if(connection.IntegratedSecurity) 
      { 
       sb.Append("Integrated Security=true;"); 
      } 
      else 
      { 
       sb.Append("user id=" + connection.UserName + ";password=" + connection.Password); 
      } 
      return sb.ToString(); 
     } 

     public Data(oConnection connection) 
     { 

      using (var ctx = new DataClassDataContext(BuildConnection(connection))) 
      { 
       var query = from c in ctx.MyTable select c; 
       try 
       { 
        Console.WriteLine(query.Count()); 
       } 
       catch (Exception ex) 
       { 
        Console.WriteLine(ex.Message); 
       } 
      } 
     } 
    } 

Une autre note: le but de c'est vraiment être en mesure de prendre en charge ne pas avoir plusieurs chaînes de connexion différentes lors de l'exécution de requêtes qui s'étendra sur plusieurs bases de données. Par exemple: Si je veux interroger les enregistrements de compte à partir d'une base de données, puis interroger une sorte de données de recherche à partir d'une autre base de données, je devrais créer une nouvelle chaîne de connexion pour le contexte.

Toute aide serait appréciée. Merci

Répondre

4

Utilisez le constructeur qui reçoit la connexion System.Data.IDbConnection. Vous pouvez utiliser la même chaîne de connexion et appeler connection.ChangeDatabase ("mydb") avant de le transmettre au constructeur. Vous pouvez également ajouter un nouveau constructeur sur la classe partielle, de sorte que l'appel appelant ne doit pas gérer cela.

+0

Ahh, c'est aussi ce que je cherchais. Merci un million! – CodeLikeBeaker

0

vous pouvez utiliser la SqlConnectionStringBuilder classe

+0

N'est-ce pas ce que je fais dans mon deuxième exemple de code? – CodeLikeBeaker

+0

Non, vous n'utilisez pas SqlConnectionStringBuilder, vous le construisez vous-même. Réutilisez ce que le framework vous donne. –

+0

Ahh d'accord, je vois de quoi tu parles. Merci! – CodeLikeBeaker

Questions connexes