Команда входа в SQL «Выполнить как» и Linq to SQL
-
19-09-2019 - |
Вопрос
Я пытаюсь выполнить запрос sql в качестве другого входа с помощью команды «Выполнить как».Я использую Linq to SQL, поэтому я создал класс контекста данных и использую метод 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();
Независимо от того, какой запрос я запускаю во втором запросе, я получаю сообщение об ошибке сверху.Любая помощь будет оценена по достоинству.
Решение
Мне удалось обойти эту проблему в моем приложении, выполнив запрос с использованием классов 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();