我在一个页面的代码如下:
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,只适合一个用户,如果是多用户, 肯定不行,
那代码如何改成适应多用户的,切换帐套呢
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,只适合一个用户,如果是多用户, 肯定不行,
那代码如何改成适应多用户的,切换帐套呢
Session["factory"] 只能存储一个值
因为static是全局变量, 甲在不知情的情况下, 用了B数据库, 把资料全部存入B数据库.
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();
........
}
}
}
改下DbHelperSQL的类库。然后多传一个参数factory,然后判断数据库的链接后,在进行sql的操作。这样还可以批量修改下。。
嗯,你修改下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里面不就可以了。
HttpContext.Current.Session不过要注意点就是:
在自定义类库CS文件里使用System.Web.HttpContext.Current.Session获取Session时提示错误:未将对象引用设置到对象的实例。一般情况下通过这种方式获取Session值不会有问题,不过应特别注意要使用session必须要page_load方法执行以建立了page对象以后才有session的使用目标,此时先检测Session是否为Null再调用值是不会提示错误的。如果直接在Page页面中定义一个全局变量取Session的值就会提示未设置实例的错误!使用Application,Cookie同理也需注意这个问题。
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;
}
}
你引用了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 "";
}
}