【发布时间】:2015-04-19 11:53:55
【问题描述】:
我有一个以 SQL 2008 作为后端的 ASP.Net 3.5 Web 应用程序。我使用 ADO.Net 的企业库 Data Helper 类 (Entlib 4.1) 来访问 DB 及其存储过程。
我最初在一个存储过程中设置了CONTEXT_INFO,然后在随后的存储过程中,我使用CONTEXT_INFO 中设置的值来过滤查询。它在此设置中完美运行。
我调用该过程以使用数据帮助程序类从我的 C# 代码中设置 CONTEXT_INFO,然后调用使用 CONTEXT_INFO 的其他 SP。一切正常。
然后我使用 EntLib 6 迁移到 ASP.NET 4.5.1 框架(也尝试使用 5)。我面临一个基本问题,即CONTEXT_INFO 值在随后的 2 次 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), '')))))
请提供您的意见。
谢谢, 阿南德
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 没有保留。
【问题讨论】:
标签: asp.net sql-server enterprise-library