Вопрос

Я пытаюсь выполнить запрос 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();
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top