Apa cara terbaik untuk meminta data dari MS SQL Server di C #?
Saya tahu bahwa bukan praktik yang baik untuk memiliki kueri SQL dalam kode.
Apakah cara terbaik untuk membuat prosedur tersimpan dan menyebutnya dari C # dengan parameter?
using (var conn = new SqlConnection(connStr))
using (var command = new SqlCommand("StoredProc", conn) { CommandType = CommandType.StoredProcedure }) {
conn.Open();
command.ExecuteNonQuery();
conn.Close();
}
c#
sql
sql-server
Bruno
sumber
sumber
// SQLCODE
melakukannya - tetapi Anda harus ingat untuk melakukan itu.Jawaban:
Menggunakan prosedur tersimpan adalah salah satu cara, dan telah digunakan secara luas selama bertahun-tahun.
Cara yang lebih modern untuk berinteraksi dengan database SQL Server dari C # (atau bahasa NET.) Adalah dengan menggunakan Entity Framework. Keuntungan dari Entity Framework adalah memberikan tingkat abstraksi yang lebih tinggi.
Mengutip dari Microsoft ( https://msdn.microsoft.com/en-us/data/jj590134 ):
ADO.NET Entity Framework memungkinkan pengembang untuk membuat aplikasi akses data dengan pemrograman terhadap model aplikasi konseptual alih-alih pemrograman langsung terhadap skema penyimpanan relasional. Tujuannya adalah untuk mengurangi jumlah kode dan pemeliharaan yang diperlukan untuk aplikasi berorientasi data. Aplikasi Entity Framework memberikan manfaat berikut:
Penggunaan ORM vs Stored Procedures melibatkan pengorbanan, khususnya dalam hal keamanan dan di mana logika berada.
Pendekatan "klasik" untuk pengembangan dengan SQL Server adalah memiliki logika aplikasi berada dalam prosedur tersimpan dan program hanya diberi hak keamanan untuk menjalankan prosedur tersimpan, bukan memperbarui tabel secara langsung. Konsepnya di sini adalah bahwa prosedur tersimpan adalah lapisan logika bisnis untuk aplikasi. Sementara teorinya sehat, ia cenderung tidak disukai karena berbagai alasan, digantikan dengan menerapkan logika bisnis dalam bahasa pemrograman seperti C # atau VB. Aplikasi yang baik masih diimplementasikan dengan pendekatan berjenjang, termasuk pemisahan masalah dll. Tetapi lebih cenderung mengikuti pola seperti MVC.
Salah satu kelemahan menerapkan logika dalam ORM daripada database adalah kemudahan debugging dan menguji aturan integritas data oleh mereka yang bertanggung jawab untuk database (DA atau DBA). Ambil contoh klasik mentransfer uang dari giro Anda ke rekening tabungan, penting bahwa ini dilakukan sebagai unit atom, dengan kata lain diapit dalam suatu transaksi. Jika transfer semacam ini hanya diperbolehkan dilakukan melalui prosedur tersimpan, relatif mudah bagi DA dan auditor untuk QA prosedur tersimpan.
Jika di sisi lain ini dilakukan melalui ORM seperti Entity Framework dan dalam produksi diketahui bahwa jarang terjadi uang diambil dari pengecekan tetapi tidak dimasukkan ke dalam debugging tabungan mungkin jauh lebih kompleks, terutama jika beberapa program berpotensi terlibat. Ini kemungkinan besar akan menjadi kasus tepi, mungkin melibatkan masalah perangkat keras khusus yang perlu terjadi dalam urutan tertentu dll. Bagaimana cara seseorang menguji ini?
sumber
Sebenarnya pernyataan dasar masih bisa diperdebatkan - ada pertukaran baik cara antara memiliki SQL dalam kode atau memiliki kode dalam database (yang mana Anda menuju dengan prosedur tersimpan).
Hasilnya adalah bahwa tidak ada satu pun "yang terbaik", ini bukan sesuatu yang dapat digeneralisasi karena ke mana pun Anda pergi, Anda membuat kompromi (Anda mendapatkan manfaat tetapi juga memperkenalkan kendala).
Jika ada korespondensi satu ke satu antara aplikasi Anda dan basis data Anda, maka itu tidak masalah. Jika, di sisi lain, Anda memiliki basis data inti besar yang dibagikan oleh sejumlah besar aplikasi yang menegakkan konsistensi di dalam basis data di antara aplikasi-aplikasi itu menjadi jauh lebih penting.
Yang lebih penting adalah khawatir tentang arsitektur dan pelapisan aplikasi Anda - diberi lapisan akses data yang tepat apakah menggunakan ORM seperti Entity Framework atau NHibernate atau melakukan sesuatu yang lebih langsung harus mengisolasi sebagian besar aplikasi Anda dari keputusan ini, terlepas dari apakah Anda membuat kueri atau gunakan prosedur tersimpan.
Saya akan dengan bebas, saya cenderung bekerja pada proyek yang relatif kecil dengan tim kecil (1-3 devs) - menggunakan prosedur tersimpan, bagi saya, lebih banyak masalah daripada nilainya karena mengingat sifat aplikasi kita (dan skillet saya?) Menyebarkan baru kode umumnya jauh lebih mudah daripada memperbarui skema (bahkan memungkinkan saya memiliki kode yang membuat memperbarui skema relatif mudah) dan saya dapat menegakkan aturan bisnis dengan menggunakan kode akses data umum. Ini jelas merupakan contoh klasik dari "Your Mileage May Vary".
sumber
Selama Anda telah menetapkan input Anda, pendekatan apa pun valid. Sebagian besar tidak memiliki pertanyaan dalam argumen kode yang berasal dari masa lalu yang buruk ketika banyak perpustakaan memaksa Anda untuk menambahkan pernyataan Anda bersama-sama dan dari situlah serangan injeksi sql berasal.
sumber
Praktik terbaik benar-benar berlebihan di sini - ada banyak cara bagus untuk melakukannya dan yang Anda pilih benar-benar harus bergantung pada apa aplikasi Anda dan apa yang perlu Anda lakukan. Yang mengatakan, hanya ada dua hal yang dapat Anda lakukan salah:
Seperti yang ditunjukkan oleh @Bill, Anda harus selalu membuat parameter pertanyaan Anda. String building adalah vektor yang mudah untuk injeksi SQL dan juga segala macam kesulitan untuk melacak bug. Banyak orang yang lebih pintar menemukan cara untuk meluputkan dan melarikan diri dari sql sehingga Anda tidak perlu mencari tahu sendiri.
Tutup koneksi Anda. Cara terbaik adalah untuk membungkus segala sesuatu dengan menggunakan pernyataan, tetapi coba / tangkap / akhirnya keren juga jika itu mengapung perahu Anda. Tetapi selalu pastikan Anda menggunakan koneksi seperti mobil murah - mengendarainya dengan keras dan cepat dan menyingkirkannya dengan cepat.
Praktik lain yang akan saya perdebatkan adalah bahwa Anda harus memastikan untuk berkonsentrasi kode akses data Anda di tempat sesedikit mungkin. Kami tidak mengizinkan aplikasi web front-end untuk memegang referensi langsung ke System.Data.SqlClient untuk membantu menegakkan peringatan ini.
sumber