Pergunta

Eu estou tentando executar uma consulta SQL como outro login utilizando o comando 'Executar como'. Eu estou usando LINQ to SQL, para que eu tenha gerado uma classe de contexto de dados e estou usando o método ExecuteQuery para executar o 'Executar como' comando SQL. Eu, então, chamar um comando LINQ to SQL que é bem sucedida. No entanto, todas as consultas subsequentes falhar com o seguinte erro:

Ocorreu um erro grave no comando atual. Os resultados, se houver, deve ser descartada.

Aqui está o trecho de código que eu tentei:

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

Não importa o que consulta eu corro na segunda consulta eu recebo a mensagem de erro acima. Qualquer ajuda seria apreciada.

Foi útil?

Solução

Eu consegui contornar este problema na minha aplicação por executar a consulta usando classes 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

Outras dicas

Você pode já ter governado isso, mas uma possível solução seria a de simplesmente criar o contexto de dados com uma seqüência de conexão diferente.

Para editar a seqüência de conexão, você pode definir a propriedade DataContext.Connection.ConnectionString. Já fiz isso antes no método parcial OnCreated (), que é chamado quando o contexto de dados é criado. Eu não testei, mas eu acho que você também pode fazer:

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

Aqui está um artigo que descreve esta bem - http://www.mha.dk/post/Setting-DataContext-Connection-String-at-runtime.aspx

Eu estava tendo um problema semelhante e, olhando para a resposta de Ruskey eu era capaz de Executar como usuário, mas percebeu que eu estava recebendo erros ao executar outras consultas depois disso. Foi devido à Revert faltando. Assim, para qualquer um que tem um problema semelhante é assim que os olhares de código semelhante.

 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();
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top