Jestem pewien, że na to pytanie już udzielono odpowiedzi, jednak nie mogłem znaleźć odpowiedzi za pomocą narzędzia wyszukiwania.
Używając C #, chciałbym uruchomić plik .sql. Plik sql zawiera wiele instrukcji sql, z których niektóre są podzielone na wiele wierszy. Próbowałem wczytać plik i spróbowałem uruchomić plik za pomocą ODP.NET ... jednak nie sądzę, aby funkcja ExecuteNonQuery była naprawdę zaprojektowana do tego.
Więc próbowałem użyć sqlplus poprzez tworzenie procesu ... jednak jeśli nie utworzyłem procesu z UseShellExecute ustawionym na true sqlplus, zawiesiłoby się i nigdy nie zakończył. Oto kod, który NIE DZIAŁA.
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 nigdy nie zwraca .... Chyba że ustawię UseShellExecute na true. Efektem ubocznym UseShellExecute jest brak możliwości przechwycenia przekierowanych danych wyjściowych.
Odpowiedzi:
źródło
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
Wypróbowałem to rozwiązanie z Microsoft.SqlServer.Management, ale nie działało dobrze z .NET 4.0, więc napisałem inne rozwiązanie wykorzystujące tylko framework .NET libs.
źródło
Działa to na platformie Framework 4.0 lub nowszej. Obsługuje „GO”. Pokaż także komunikat o błędzie, wiersz i polecenie sql.
źródło
connection.Close()
połączenia, zostanie zamknięte przez tousing
, w co go zapakowałeś.Umieść polecenie wykonania skryptu sql w pliku wsadowym, a następnie uruchom poniższy kod
w pliku wsadowym napisz coś takiego (przykład dla serwera sql)
źródło
To działa dla mnie:
źródło
Dodano dodatkowe ulepszenia do odpowiedzi surajits:
Musiałem również dodać następujące odniesienia do mojego projektu:
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
Nie mam pojęcia, czy są to odpowiednie biblioteki dll: s, ponieważ w C: \ Program Files \ Microsoft SQL Server znajduje się kilka folderów, ale w mojej aplikacji te dwa działają.
źródło
Udało mi się wypracować odpowiedź, czytając instrukcję :)
Ten wyciąg z MSDN
Zamienia kod w to;
Który teraz wychodzi poprawnie.
źródło
p.StandardOutput.ReadToEnd();
nigdy nie wychodziNależy wziąć pod uwagę dwie kwestie.
1) Ten kod źródłowy działał dla mnie:
Ustawiłem katalog roboczy na katalog skryptów, aby działały również skrypty podrzędne w skrypcie.
Nazwij to np. Jako
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Musisz sfinalizować skrypt SQL za pomocą instrukcji
EXIT;
źródło
Korzystając z EntityFramework, możesz skorzystać z takiego rozwiązania. Używam tego kodu do inicjalizacji testów e2e. Aby zapobiec atakom sql injection, upewnij się, że nie generujesz tego skryptu na podstawie danych wejściowych użytkownika ani nie używaj w tym celu parametrów polecenia (zobacz przeciążenie ExecuteSqlCommand, który akceptuje parametry).
źródło
Nie mogłem znaleźć żadnego dokładnego i ważnego sposobu, aby to zrobić. Więc po całym dniu przyszedłem z tym mieszanym kodem uzyskanym z różnych źródeł i próbując wykonać zadanie.
Ale nadal generuje wyjątek,
ExecuteNonQuery: CommandText property has not been Initialized
mimo że pomyślnie uruchamia plik skryptu - w moim przypadku pomyślnie tworzy bazę danych i wstawia dane przy pierwszym uruchomieniu.źródło