SQL Команда "Выполнить как" и Linq to SQL

Я пытаюсь выполнить SQL-запрос в качестве другого входа в систему с помощью команды "Выполнить как". Я использую Linq to SQL, поэтому я сгенерировал класс Data Context и использую метод ExecuteQuery для выполнения команды SQL "Выполнить как". Затем я вызываю успешную команду Linq to SQL. Однако каждый последующий запрос завершается с ошибкой:

Произошла серьезная ошибка в текущей команде. Результаты, если таковые имеются, должны быть отброшены.

Вот фрагмент кода, который я пробовал:

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

Независимо от того, какой запрос я выполняю по второму запросу, я получаю сообщение об ошибке сверху. Любая помощь будет оценена.

3 ответа

Решение

Мне удалось обойти эту проблему в моем приложении, выполнив запрос с использованием классов 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

Возможно, вы уже исключили это, но один из возможных способов обойти это просто создать контекст данных с другой строкой соединения.

Чтобы отредактировать строку подключения, вы можете установить свойство 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

У меня была похожая проблема, и, посмотрев на ответ Руски, я смог выполнить "Выполнить как пользователь", но заметил, что после этого я получал ошибки при выполнении других запросов. Это было из-за пропавшего возврата. Так что для любого, имеющего подобную проблему, так выглядит код.

 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();
Другие вопросы по тегам