我有一个以SQL 2008为后端的ASP.Net 3.5 web应用程序。我使用ADO.Net的企业库Data Helper类(Entlib 4.1)来访问数据库及其存储过程。
我最初在存储过程中设置CONTEXT_INFO
,然后在随后的存储过程中,我使用CONTEXT_INFO
中设置的值来过滤查询。它在这个设置中运行得很好。
我使用数据助手类从C#代码中调用设置CONTEXT_INFO
的过程,然后调用使用CONTEXT_INFO
的其他SP。一切都很好。
然后,我使用EntLib6迁移到ASP.NET 4.5.1框架(也尝试过使用5)。我面临的一个根本问题是,CONTEXT_INFO
值没有在随后的两次SP调用之间保留。我尚未关闭调用SP的/后续调用之间的连接。因此,我的SP没有返回值。
用于设置CONTEXT_INFO的SP
DECLARE @ContextInfo varbinary(128)
SELECT @ContextInfo = cast( @SomeIDPassed AS varbinary(128) )
SET CONTEXT_INFO @ContextInfo
使用CONTEXT_INFO的其他SP
(CONVERT(int, RTRIM(REPLACE(CONVERT(varchar(128), CONTEXT_INFO()),char(0), '')))))
请提供您的意见。
谢谢,Anand
public class DataHelper:DataBase,IDisposable
{
public DataHelper() :
base(AppDBConnString)
{
//If the user is logged in
SetDBContextInfo(11);
}
private void SetDBContextInfo(int userId)
{
//Setting the User Context info for the SQL Server
DbParameter[] parameter = new SqlParameter[1];
parameter[0] = new SqlParameter("@userID", userId.ToString());
parameter[0].DbType = DbType.String;
parameter[0].Direction = ParameterDirection.Input;
ExecuteNonQuery("spSetContextInfo", parameter);
}
public virtual IDataReader ExecuteReader(String spName, DbParameter[] dbParameters)
{
IDataReader reader = null;
DbCommand dbCmd = BuildCommand(spName, dbParameters);
if (transaction != null)
reader = db.ExecuteReader(dbCmd, transaction);
else
reader = db.ExecuteReader(dbCmd);
return reader;
}
}
执行上述方法的代码
DataHelper helper = new DataHelper();
DbParameter[] parameter = new SqlParameter[1];
parameter[0] = new SqlParameter("parameter0", "");
parameter[0].DbType = DbType.String;
drOrgGroupList = helper.ExecuteReader("MYProcedureName", parameter).AsSqlDataReader();
这不会返回任何数据,因为CONTEXT_INFO
未被保留。
这可能是因为每次打开连接时都需要运行您的代码(设置CONTEXT_INFO的代码)。您随后的数据库调用可能会从连接池中选择不同的连接。您需要确保Enterprise Library(或您可能使用的任何程序)在会话打开后立即运行代码。