【问题标题】:Subsonic: dynamic connections亚音速:动态连接
【发布时间】:2009-06-09 05:59:15
【问题描述】:

我有一个古老的烂摊子,我正试图使用​​亚音速铲成层。麻烦的是,我有这种情况:

当 Hal 登录时,他的登录使用数据库 X 查找数据,数据库 Y 用于他的帐户,数据库 Z 用于他的联系人。

当 Barry 登录时,他的登录使用数据库 X 查找数据,数据库 Q 用于他的帐户,数据库 R 用于他的联系人。

X,Y,Z,Q 和 R 都在同一个服务器上。 Y 与 Q 具有相同的架构,并且 Z 与 R 具有相同的架构。不要让我开始说这是多么愚蠢的设置:)

我必须让我的 .NET Winforms 应用程序(使用 subsonic)指向正确的数据库。

据我所知,我必须亲自更改 SubSonic 源(并在每个 subsonic 版本中保持这些更改),因此它可以接受参数而不是使用 app.config。谁能看到这个的替代方案?

【问题讨论】:

    标签: .net winforms subsonic


    【解决方案1】:

    我从来没有认为“SharedDbConnectionScope”很容易或适合我的应用程序

    但这就是答案,不是吗?这就是我们将它放在那里的原因 - 是的,我已经听到您即时更改连接的请求,并且我已经内置了它,正如我在我们拥有的每个线程中一直告诉您的那样。

    即时更改连接是我们长期以来一直提出的一个请求,并且我们在很久以前就将其添加到了那里 - 据我所知,它就像一个魅力。

    对于 SubSonic 3,我插入了大约 10 种不同的方式,您可以随时更改您的 DB 连接,使用您想要的任何对象集到您想要的任何平台。

    【讨论】:

      【解决方案2】:

      您不需要修改源代码,您应该能够使用多个提供程序与不同的数据库通信并在运行时在它们之间切换。 请查看以下问题以了解如何执行此操作:

      Separate Read/Write Connection for SubSonic

      【讨论】:

        【解决方案3】:
        1. Subsonic 可以为多个数据库创建一个 dal。 只需将引用另一个连接字符串的提供程序添加到您的 app.config。 修改每个提供者的命名空间。

        现在您应该可以访问: 我的命名空间.R... 我的.Namespace.X...

        1. 您可以轻松地即时更改连接:

          using (SharedDbConnectionScope scope = new SharedDbConnectionScope("new connectionstring "))
          {
          }
          

        如果您一次不需要多个连接,这也是可能的。 我们使用它来注销并登录到另一台服务器(另一个副作用是,您不需要拥有 app/web.config。

        在这里找到这个例子:http://www.digvijay.eu/post/2008/10/30/SubSonic-Trick-Specify-connection-string-at-runtime!.aspx

        每次调用 InitSubsonic 时,连接都会更改。

        public class MySubsonicProvider
        {
        
            private static bool _bIsInitialized = false;
        
            public static void InitSubsonic(string server, string schema, string user, string password)
            {
        
                DataService.Providers = new DataProviderCollection();
        
                // here you can get settings from anywhere and make up a connection string :)
                MyDataProvider provider = new MyDataProvider("Server={0};Database={1};Uid={2};Password={3}", server, schema, user, password);
                DataService.Providers.Add(provider);
                DataService.Provider = provider;
        
                _bIsInitialized = true;
        
                // Clear cached values
                ClearSubSonicCache();
        
            }
        
            public class MyDataProvider : MySqlInnoDBDataProvider
            {
        
                private string _server;
                private string _schema;
                private string _user;
                private string _password;
        
                public string Server { get { return _server; } }
                public string Schema { get { return _schema; } }
                public string User { get { return _user; } }
                public string Password { get { return _password; } }
        
                public MyDataProvider(string connectionString, string server, string schema, string user, string password)
                {
                    DefaultConnectionString = String.Format(connectionString, server, schema, user, password);
        
                    _server = server;
                    _schema = schema;
                    _user = user;
                    _password = password;
        
                }
        
                public override string Name
                {
                    get { return "MyDataProvider"; }
                }
        
            }
        }
        

        【讨论】:

          【解决方案4】:

          谢谢各位。我已经解决了多个提供程序,但不知道如何在运行时设置它们(我已经搜索过这个论坛。一定使用了错误的关键字)。

          SharedDBConnectionScope 似乎非常适合即时使用,但似乎并非旨在为整个用户会话设置提供程序。

          所以我根据你上面的答案做了更多的搜索,并提出了以下解决方案:

          1) 为查找、帐户和联系人添加三个提供程序,并生成 DAL。

          2) 将此添加到 DAL:

          public static void SetProvider(string strProvider,string strConnectionString)
          {
              DataService.GetInstance(strProvider).DefaultConnectionString = 
                                                               strConnectionString;
          }
          

          3) 在我的应用确定用户使用哪些数据库后,在登录时调用它,例如

          MyDAL.SSProvider.SetProvider("Lookups", 
                      "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=X")
          
          MyDAL.SSProvider.SetProvider("Accounts", 
                "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Y")
          
          MyDAL.SSProvider.SetProvider("Contacts",    
                         "server=10.123.456.78;port=3306;uid=whatever;pwd=blah;database=Z")
          

          然后它就消失了。

          【讨论】:

          • 我只是想用我自己的经历来跟进这篇文章,TheVillageIdiot's 对我有用!!!
          • 我正在写一篇博文,并会在这里详细解释我如何实施 TheVillageIdiots 解决方案
          【解决方案5】:

          另一个动态更改提供程序的示例(在运行时)。 这个从一个数据库中读取项目并将它们保存到另一个。

          用途:

          CopyToAnotherDB<Dock>(Dock.Columns.Id, Dock.BarcodeStringColumn);
          

          方法:

              public static void CopyToAnotherDB<E>(string identifierColumnName, TableSchema.TableColumn fakeDirtyColHack)
                  where E : ActiveRecord<E>, new()
              {
                  SqlQuery q = new Select().From<E>();
                  q.ProviderName = SERVU_PROVIDER;
                  IList<E> list = q.ExecuteTypedList<E>();
          
                  string connStr = ConfigurationManager.ConnectionStrings[ARCHIVE_PROVIDER].ConnectionString;
                  using (SharedDbConnectionScope scope = new SharedDbConnectionScope(connStr))
                  {
                      foreach (E item in list)
                      {
                          int itemID = (int)item.GetColumnValue(identifierColumnName);
                          SqlQuery qry = new Select(identifierColumnName).From<E>().Where(identifierColumnName).IsEqualTo(itemID);
                          int recCount = qry.GetRecordCount();
                          E obj = item.Clone();
          
                          obj.IsNew = recCount == 0; //determines if adding or updating
                          obj.IsLoaded = !obj.IsNew; //determines if adding or updating
                          obj.DirtyColumns.Add(fakeDirtyColHack);
                          obj.Save();
                      }
                  }
              }
          

          【讨论】:

            猜你喜欢
            • 2010-12-06
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-01-08
            • 2010-11-13
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多