База данных LINQ - PullRequest
       17

База данных LINQ

2 голосов
/ 20 марта 2009

У меня есть система, которая поддерживает несколько продуктов. Каждый продукт имеет собственную базу данных с одинаковой точной схемой.

Когда я передаю строку подключения в качестве параметра моему конструктору контекста данных, он всегда использует базу данных по умолчанию, указанную в строке подключения, или базу данных по умолчанию пользователя, подключающегося, если я не предоставляю исходный каталог в строке подключения .

Я бы хотел, чтобы система использовала базу данных без изменения строки подключения и передачи имени базы данных в качестве параметра.

Вот пример кода, который я использую:

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);
                }



            }
        }
    }

Если этот код будет выполнен, то первый результат будет извлекаться из базы данных 1, а второй результат извлекается из базы данных 2. Я хотел бы иметь возможность извлекать из базы данных, которая не указана в строке подключения. Причина этого в том, что база данных может измениться в зависимости от конкретного сценария, но строка подключения останется прежней.

Вот пример того, что я использую, чтобы «подделать» его, но я не думаю, что это лучшее решение для этого:

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);
                }
            }
        }
    }

Еще одно примечание: цель этого в действительности состоит в том, чтобы поддерживать отсутствие нескольких разных строк подключения при выполнении запросов, которые будут охватывать несколько баз данных. Например: если я хочу запросить записи учетной записи из базы данных, а затем запросить какие-либо данные поиска из другой базы данных, мне потребуется создать новую строку подключения для контекста.

Любая помощь будет оценена. Спасибо

Ответы [ 2 ]

4 голосов
/ 20 марта 2009

Используйте конструктор, который получает соединение System.Data.IDbConnection. Вы можете использовать ту же строку подключения и вызвать connection.ChangeDatabase ("mydb") перед передачей ее конструктору. В качестве альтернативы вы можете добавить новый конструктор в частичный класс, чтобы вызывающий вызов не имел с этим дело.

0 голосов
/ 20 марта 2009

вы можете использовать SqlConnectionStringBuilder класс

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...