2009-12-14 50 views
2

我试图执行一个sql查询作为另一个登录使用'执行作为'命令。我正在使用Linq to SQL,所以我生成了一个Data Context类,并且正在使用ExecuteQuery方法来运行'Execute As'SQL命令。然后我调用一个成功的Linq to SQL命令。然而,每一个后续查询失败,出现以下错误:SQL'执行为'登录命令和Linq到SQL

A severe error occurred on the current command. The results, if any, should be discarded.

这里是代码片段,我曾尝试:

SummaryDataContext summary = new SummaryDataContext(); 
summary.ExecuteQuery<CustomPostResult>(@"Execute as Login='Titan\Administrator'"); 
var test = summary.Customers.First(); 
var test2 = summary.Products.ToList(); 

无论我得到什么查询我的第二个查询运行错误信息从上面。任何帮助,将不胜感激。

回答

2

我设法解决这个问题,在我的应用程序通过执行使用ADO查询.NET类。

SqlCommand cmd = new SqlCommand("EXECUTE AS USER = 'operator'"); 
cmd.Connection = dc.Connection as SqlConnection; 
cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 

// do the rest of the queries using linq to sql 
0

您可能已经排除了这一点,但一个可能的解决方法是简单地使用不同的连接字符串创建数据上下文。

要编辑连接字符串,可以设置DataContext.Connection.ConnectionString属性。我之前在部分方法OnCreated()中完成了它,它在数据上下文被创建时被调用。我没有测试过,但我想你也可以这样做:

YourDataContext dc = new YourDataContext(); 
dc.Connection.ConnectionString = "connection string here"; 

下面是描述这个问题,以及一篇文章 - http://www.mha.dk/post/Setting-DataContext-Connection-String-at-runtime.aspx

+0

不同的连接字符串...这意味着你存储在用户的密码以纯文本格式,这样就可以用它来连接到数据库? – Crisfole 2014-01-30 14:43:35

0

我有一个类似的问题,并通过查看ruskey的回答,我能够执行的用户,但注意到运行后,其他查询时,我渐渐的错误。这是由于缺少Revert。所以对于任何有类似问题的人来说,这就是代码的样子。

SqlCommand cmd = new SqlCommand("EXECUTE AS USER = 'domain\\user';"); 
OSSDBDataContext dc = new OSSDBDataContext(); 
cmd.Connection = dc.Connection as SqlConnection; 
cmd.Connection.Open(); 
cmd.ExecuteNonQuery(); 

//Execute stored procedure code goes here 

SqlCommand cmd2 = new SqlCommand("REVERT;"); 
cmd2.Connection = dc.Connection as SqlConnection; 
cmd2.ExecuteNonQuery();