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();