Tenho certeza de que esta pergunta já foi respondida, mas não consegui encontrar uma resposta usando a ferramenta de pesquisa.
Usando c #, eu gostaria de executar um arquivo .sql. O arquivo sql contém várias instruções sql, algumas das quais são divididas em várias linhas. Eu tentei ler o arquivo e tentei executá-lo usando o ODP.NET ... no entanto, não acho que o ExecuteNonQuery seja realmente projetado para fazer isso.
Então, tentei usar o sqlplus via gerar um processo ... no entanto, a menos que eu gerasse o processo com UseShellExecute definido como true, o sqlplus seria interrompido e nunca sairia. Aqui está o código que NÃO FUNCIONA.
Process p = new Process();
p.StartInfo.UseShellExecute = false;
p.StartInfo.RedirectStandardOutput = true;
p.StartInfo.FileName = "sqlplus";
p.StartInfo.Arguments = string.Format("xx/xx@{0} @{1}", in_database, s);
p.StartInfo.CreateNoWindow = true;
bool started = p.Start();
p.WaitForExit();
WaitForExit nunca retorna .... A menos que eu defina UseShellExecute como true. Um efeito colateral do UseShellExecute é que você não pode capturar a saída redirecionada.
Respostas:
fonte
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
Tentei esta solução com Microsoft.SqlServer.Management, mas não funcionou bem com o .NET 4.0, por isso escrevi outra solução usando apenas a estrutura de bibliotecas do .NET.
fonte
Isso funciona no Framework 4.0 ou superior. Suporta "GO". Mostrar também a mensagem de erro, linha e comando sql.
fonte
connection.Close()
a conexão seja fechada quandousing
você a envolve. #Coloque o comando para executar o script sql em um arquivo em lotes e execute o código abaixo
no arquivo em lote, escreva algo parecido com isto (exemplo para sql server)
fonte
Isso funciona para mim:
fonte
Adicionadas melhorias adicionais à resposta dos surajits:
Além disso, eu tive que adicionar as seguintes referências ao meu projeto:
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.ConnectionInfo.dll
C:\Program Files\Microsoft SQL Server\120\SDK\Assemblies\Microsoft.SqlServer.Smo.dll
Não tenho idéia se essas são as dll: s certas para usar, pois existem várias pastas em C: \ Arquivos de Programas \ Microsoft SQL Server, mas no meu aplicativo essas duas funcionam.
fonte
Eu consegui descobrir a resposta lendo o manual :)
Este extrato do MSDN
Transforma o código nisso;
Que agora sai corretamente.
fonte
p.StandardOutput.ReadToEnd();
nunca saiHá dois pontos a considerar.
1) Este código fonte funcionou para mim:
Defino o diretório de trabalho como o diretório de scripts, para que os sub-scripts dentro do script também funcionem.
Chame, por exemplo, como
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Você deve finalizar seu script SQL com a instrução
EXIT;
fonte
Usando o EntityFramework, você pode usar uma solução como esta. Eu uso esse código para inicializar os testes e2e. Para evitar ataques de injeção de sql, certifique-se de não gerar esse script com base na entrada do usuário ou use parâmetros de comando para isso (consulte a sobrecarga de ExecuteSqlCommand que aceita parâmetros).
fonte
Não consegui encontrar nenhuma maneira exata e válida de fazer isso. Então, depois de um dia inteiro, eu vim com esse código misto obtido de diferentes fontes e tentando fazer o trabalho.
Mas ainda está gerando uma exceção
ExecuteNonQuery: CommandText property has not been Initialized
, apesar de executar com êxito o arquivo de script - no meu caso, ele cria o banco de dados e insere dados na primeira inicialização.fonte