代码之家  ›  专栏  ›  技术社区  ›  CodeLikeBeaker

LINQ数据库

  •  2
  • CodeLikeBeaker  · 技术社区  · 16 年前

    我有一个支持多种产品的系统。每个产品都有自己的数据库,并且有相同的模式。

    当我将连接字符串作为参数传递给我的数据上下文构造函数时,它总是使用连接字符串中列出的默认数据库,或者如果我没有在连接字符串中提供初始目录,则使用连接用户的默认数据库。

    我希望能够让系统使用一个数据库,而不必更改连接字符串,并将数据库名称作为参数传入。

    下面是我使用的代码示例:

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

    如果执行此代码,那么第一个结果将从database1中提取,第二个结果将从database2中提取。我希望它能够从连接字符串中没有提供的数据库中提取数据。原因是数据库可能会根据特定的场景进行更改,但连接字符串将保持不变。

    下面是一个我用来“伪造”它的例子,但我并不认为这是最好的解决方法:

    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 回复  |  直到 16 年前
        1
  •  4
  •   eglasius    16 年前

    使用接收System.Data.IdbConnection连接的构造函数。您可以使用相同的连接字符串,并在将其传递给构造函数之前调用connection.changedatabase(“mydb”)。或者,您可以在分部类上添加一个新的构造函数,这样调用就不必处理这个问题。

        2
  •  0
  •   Oscar Cabrero    16 年前

    可以使用sqlConnectionStringBuilder 班