C#linq-to-sql,在每个会话中设置一个数据库会话变量

时间:2016-04-21 23:40:05

标签: c# linq linq-to-sql

问题: 有没有办法设置数据库会话变量:

declare @app_user varchar(30)='otto'

在C#中使用linq-to-sql,这样变量可用于DB中的触发器?

背景: 我正在使用触发器实现穷人的日记功能,我想传递应用程序用户以包含在日志表中:

CREATE TRIGGER [Trg_Jrn_Table1] ON [dbo].[Table1]
FOR INSERT, UPDATE, DELETE AS
...
INSERT INTO dbo.[Jrn_Table1] ([jrnDmlType],[jrnUser],<cols>...)
SELECT @dml_type, @app_user, <cols> FROM inserted i WITH (NOLOCK)

(我知道我还需要用suser_sname来跟踪临时更改)

我能找到的关于linq2sql和会话变量的所有内容都集中在C#会话变量上,我真的不知道从哪里开始。我希望有类似的东西:

DataContext dc = createDataContext(cfg);
dc.addSessionData("app_user", "otto");

但自然不存在: - )

是否可以使用db会话变量?或者使用:setvarCONTEXT_INFO

2016年4月22日更新: 我尝试在两个地方添加c#代码,其中创建了DataContext并且在更新之前。我可以看到我的命令在日志中执行,但是从触发器中,临时数据不可用。

  1. 设置会话变量:

    DataContext.ExecuteCommand("declare @app_user varchar(30)={0}", username);
    
  2. 在临时表中

    DataContext.ExecuteCommand("select {0} usrName into #session_info", username);
    
  3. 使用context_info(参见:link

    DataContext.ExecuteCommand("declare @Length tinyint;declare @Ctx varbinary(128);select @Length = len({0});select @Ctx = convert(binary(1), @Length) + convert(varbinary(127), {1});set context_info @Ctx", username, username);
    

0 个答案:

没有答案