【问题标题】:Using SQL Server CONTEXT_INFO feature in ASP.Net + Enterprise Library (v5 & above)在 ASP.Net + Enterprise Library(v5 及更高版本)中使用 SQL Server CONTEXT_INFO 功能
【发布时间】: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


    【解决方案1】:

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

    【讨论】:

    • 我首先调用设置 CONTEXT_INFO 的存储过程,然后立即调用使用之前设置的 CONTEXT_Info 的其他存储过程。这不会返回任何数据,因为不保留 CONTEXT_INFO。我在上面的原始问题中添加了代码片段
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-22
    • 1970-01-01
    • 2016-12-26
    • 2021-03-29
    • 2013-08-01
    • 1970-01-01
    相关资源
    最近更新 更多