Saya yakin pertanyaan ini sudah dijawab, namun saya tidak dapat menemukan jawaban menggunakan alat pencarian.
Menggunakan c # Saya ingin menjalankan file .sql. File sql berisi beberapa pernyataan sql, beberapa di antaranya rusak karena beberapa baris. Saya mencoba membaca dalam file dan mencoba mengeksekusi file menggunakan ODP.NET ... namun saya tidak berpikir ExecuteNonQuery benar-benar dirancang untuk melakukan ini.
Jadi saya mencoba menggunakan sqlplus melalui pemijinan sebuah proses ... namun kecuali saya memunculkan proses dengan UseShellExecute yang disetel ke sqlplus sejati akan hang dan tidak pernah keluar. Berikut kode yang TIDAK BEKERJA.
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 tidak pernah kembali .... Kecuali saya mengatur UseShellExecute menjadi true. Efek samping dari UseShellExecute adalah Anda tidak dapat menangkap output yang dialihkan.
Jawaban:
sumber
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5"/> </startup>
Saya mencoba solusi ini dengan Microsoft.SqlServer.Management tetapi tidak bekerja dengan baik dengan .NET 4.0 jadi saya menulis solusi lain menggunakan .NET libs framework saja.
sumber
Ini Berfungsi pada Kerangka 4.0 atau Lebih Tinggi. Mendukung "GO". Juga menunjukkan pesan kesalahan, baris, dan perintah sql.
sumber
connection.Close()
koneksi akan ditutup olehusing
Anda telah membungkusnya.Masukkan perintah untuk mengeksekusi skrip sql ke dalam file batch kemudian jalankan kode di bawah ini
dalam file batch menulis sesuatu seperti ini (sampel untuk server sql)
sumber
Ini bekerja untuk saya:
sumber
Menambahkan peningkatan tambahan pada jawaban surajits:
Juga, saya harus menambahkan referensi berikut ke proyek saya:
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
Saya tidak tahu apakah itu adalah hak dll: s untuk digunakan karena ada beberapa folder di C: \ Program Files \ Microsoft SQL Server tetapi dalam aplikasi saya dua pekerjaan ini.
sumber
Saya berhasil mencari jawabannya dengan membaca manual :)
Ekstrak ini dari MSDN
Ubah kode menjadi ini;
Yang sekarang keluar dengan benar.
sumber
p.StandardOutput.ReadToEnd();
tidak pernah keluarAda dua hal yang perlu diperhatikan.
1) Kode sumber ini berfungsi untuk saya:
Saya mengatur direktori kerja ke direktori skrip, sehingga sub skrip di dalam skrip juga berfungsi.
Sebut saja misalnya sebagai
Execute("usr/pwd@service", "c:\myscripts", "script.sql")
2) Anda harus menyelesaikan skrip SQL Anda dengan pernyataan tersebut
EXIT;
sumber
Menggunakan EntityFramework, Anda bisa menggunakan solusi seperti ini. Saya menggunakan kode ini untuk menginisialisasi tes e2e. Untuk mencegah serangan injeksi sql, pastikan untuk tidak membuat skrip ini berdasarkan input pengguna atau menggunakan parameter perintah untuk ini (lihat kelebihan ExecuteSqlCommand yang menerima parameter).
sumber
Saya tidak dapat menemukan cara yang tepat dan valid untuk melakukan ini. Jadi setelah seharian, saya datang dengan kode campuran ini diraih dari berbagai sumber dan mencoba menyelesaikan pekerjaan.
Tetapi masih menghasilkan pengecualian
ExecuteNonQuery: CommandText property has not been Initialized
meskipun berhasil menjalankan file skrip - dalam kasus saya, itu berhasil membuat database dan memasukkan data pada startup pertama.sumber