我在一个页面的代码如下:
 protected void HNKD_Click(object sender, EventArgs e)
    {
        Maticsoft.DBUtility.DbHelperSQL.factorychoice("KD");
        Session["factory"] = "康达电子";
        Response.Redirect("Main.aspx");
    }
    protected void HNBD_Click(object sender, EventArgs e)
    {
        Maticsoft.DBUtility.DbHelperSQL.factorychoice("BD");
        Session["factory"] = "博禄德电子";
        Response.Redirect("Main.aspx");
    }
用来切换连接字符串,,其中 Maticsoft.DBUtility.DbHelperSQL 的代码如下
public abstract class DbHelperSQL
    {
        //数据库连接字符串(web.config来配置),多数据库可使用DbHelperSQLP来实现.
        public static string connectionString = PubConstant.ConnectionString;     
        public DbHelperSQL()
        {            
       
        }        /// <summary>
        /// 进行工厂别的切换
        /// </summary>
        public static void factorychoice(string factory)
        {
            switch (factory)
            {
                case "KD":
                    connectionString = PubConstant.ConnectionString;
                    break;
                case "BD":
                    connectionString = PubConstant.ConnectionString2; ;
                    break;
            }
        }我感觉我这样子用static,只适合一个用户,如果是多用户, 肯定不行,
那代码如何改成适应多用户的,切换帐套呢

解决方案 »

  1.   

    不是 static的问题
    Session["factory"] 只能存储一个值   
      

  2.   

    存储一个值倒没有什么,只是担心 甲用户先static = "A数据库"  乙用户 登入的时候改成 static = "B数据库" ,
    因为static是全局变量, 甲在不知情的情况下, 用了B数据库, 把资料全部存入B数据库. 
      

  3.   

    就是静态连接字符串的问题,静态变量每个类只有一个,不管该类有多少个实例对象。假如 A 进入系统,选择使用账套一,此时连接字符串为一,接着 B 进入系统,选择使用账套二,连接字符串改为二,这时对于 A,也变成账套二了,这肯定乱套了。
      

  4.   

    是的呀, 我是用 动软的 简单的 三层架构,  问题是动软的三层架构喜欢 用static, 真要命.
      

  5.   

    其实我的目的就是,三层架构 数据库连接字符串(web.config来配置),可以动态更改connectionString支持多数据库.
      

  6.   

    用Session,因为Session在服务器是唯一的.建一个用户类,该用户的账号\登陆的账套等.如:
    class User
    {
      public string UserName{get;set;} //用户名
      
      public string AccCode{get;set;} //账套代码  public string DBConnectString() //获取连接窜
      { 
          return ..... //根据账套获取连接窜
      }
    }登陆时:
     Session["UserInfo"]=new User(){UserName="01",AccCode="KD"}; 任何数据操作类都需要构造传入User 对象或 Session,最好是User 对象,不能采用静态.
     
     class DB1
    {
       private User _user;
       public DB1(User user)
       {
          _user=user;
       }   public void AddData(.....)
       {
         using(SqlConnection conn=new SqlConnection(this._user.DBConnectString()))
          {
            conn.Open();
            ........
           }     
       }
    }
     
      

  7.   

    我觉得最大的问题是卡在数据访问层DBUtility, 全部方法都是采用static ,而业务逻辑层 没有使用new关键字,全部用 DataSet ds=DbHelperSQL.Query(strSql.ToString(),parameters) 的方式来访问数据访问层, 才导致这样子的一个情况,如何如何修改哦,
      

  8.   


    改下DbHelperSQL的类库。然后多传一个参数factory,然后判断数据库的链接后,在进行sql的操作。这样还可以批量修改下。。
      

  9.   

    问题是 参数factory 用什么样的方式传到 DbHelperSQL的类库里面呢 ,难道说每次操作数据库前,都要先传 参数factory 进去吗
      

  10.   


    嗯,你修改下Query函数Query(string factory,string strSql,params SqlParameter[] parameters)就行了啊。可以批量的替换Query( 为 Query(string factory,然后把
    public static void factorychoice(string factory)
      {
      switch (factory)
      {
      case "KD":
      connectionString = PubConstant.ConnectionString;
      break;
      case "BD":
      connectionString = PubConstant.ConnectionString2; ;
      break;
      }
      }这个方法改到Query里面不就可以了。
      

  11.   

    那也是,只是Query函数只是其中一个很小的函数, 此类操作数据库的函数,起码有20个,引用此类的函数的代码最少是100个,  Query函数 里面,如果能自动抓到 session的值就好了. 自己判断该多好呀,
      

  12.   

    dll里面是可以拿到Session的啊。
    HttpContext.Current.Session不过要注意点就是:
    在自定义类库CS文件里使用System.Web.HttpContext.Current.Session获取Session时提示错误:未将对象引用设置到对象的实例。一般情况下通过这种方式获取Session值不会有问题,不过应特别注意要使用session必须要page_load方法执行以建立了page对象以后才有session的使用目标,此时先检测Session是否为Null再调用值是不会提示错误的。如果直接在Page页面中定义一个全局变量取Session的值就会提示未设置实例的错误!使用Application,Cookie同理也需注意这个问题。
      

  13.   

    我用以下代码测试,发现 dd的值,始终是null, 无法理解,21楼的朋友帮忙解决一下吧,谢谢  ,万分万分的感谢.
    public static int RunProcedure(string storedProcName, IDataParameter[] parameters, out int rowsAffected)
      {
      if (System.Web.HttpContext.Current.Session["factory"] != null)
      {
      string dd = System.Web.HttpContext.Current.Session["factory"].ToString();
      }
      using (SqlConnection connection = new SqlConnection(connectionString))
      {
      int result;
      connection.Open();
      SqlCommand command = BuildIntCommand(connection, storedProcName, parameters);
      rowsAffected = command.ExecuteNonQuery();
      result = (int)command.Parameters["ReturnValue"].Value;
      //Connection.Close();
      return result;
      }
      }
      

  14.   

    我之前已经对Session["factory"] 赋过值,不应该是NULL,会不会原因在于我是三层架构, 数据访问层DBUtility是独立的项目, 不在WEB代码里面呢
      

  15.   


    你引用了using System.Web;
    我测试了下。应该是可以拿到Session的。   Session["aa"] = "1";
              int a=  SqlServerHelper.GetMaxID("userid", "t_Users");
    SqlServerHelper的函数
      public static int GetMaxID(string FieldName, string TableName)
            {
               
                string aa = GetSession();return 1;
                      }
            public static string GetSession()
            {
                if (HttpContext.Current.Session["aa"] != null)
                {
                    return HttpContext.Current.Session["aa"].ToString();
                }
                else
                {
                    return "";
                }
            }
      

  16.   

    现在问题是我是三层架构,WEB里面将  Session["aa"] = "1"; 赋值,但是项目数据访问层DBUtility 里去取Session["aa"]的值却是NULL, 我想原因是数据访问层 是独立的项目, 是类,不是page页面, 所以才会获取不到.