在ASP.Net + Enterprise Library中使用SQL Server CONTEXT_INFO功能(v5及以上版本)

时间:2015-02-18 13:02:02

标签: asp.net sql-server enterprise-library

我有一个ASP.Net 3.5 Web应用程序,其中SQL 2008作为后端。我使用ADO.Net的企业库Data Helper类(Entlib 4.1)来访问数据库及其存储过程。

我最初在存储过程中设置CONTEXT_INFO,然后在后续存储过程中,我使用CONTEXT_INFO中设置的值来过滤查询。它在这个设置中完美地工作。

我使用数据助手类调用从我的C#代码设置CONTEXT_INFO的过程,然后调用使用CONTEXT_INFO的其他SP。一切都很好。

然后我使用 EntLib 6 迁移到ASP.NET 4.5.1框架(也尝试使用5)。我面临一个基本问题,即在两次后续SP调用之间没有保留CONTEXT_INFO值。我没有关闭呼叫SP&后续呼叫之间的连接。因此,我的SP没有返回值。

SP用于设置CONTEXT_INFO

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未被保留。

1 个答案:

答案 0 :(得分:0)

这可能是因为每次打开连接时都需要运行代码(设置CONTEXT_INFO的代码)。您的后续数据库调用可能正在从连接池中选择不同的连接。您需要确保企业库(或您可能正在使用的任何内容)在会话打开后立即运行代码。