Saya mencoba meneruskan parameter array ke perintah SQL di C # seperti di bawah ini, tetapi tidak berfungsi. Adakah yang pernah bertemu sebelumnya?
string sqlCommand = "SELECT * from TableA WHERE Age IN (@Age)";
SqlConnection sqlCon = new SqlConnection(connectString);
SqlCommand sqlComm = new SqlCommand();
sqlComm.Connection = sqlCon;
sqlComm.CommandType = System.Data.CommandType.Text;
sqlComm.CommandText = sqlCommand;
sqlComm.CommandTimeout = 300;
sqlComm.Parameters.Add("@Age", SqlDbType.NVarChar);
StringBuilder sb = new StringBuilder();
foreach (ListItem item in ddlAge.Items)
{
if (item.Selected)
{
sb.Append(item.Text + ",");
}
}
sqlComm.Parameters["@Age"].Value = sb.ToString().TrimEnd(',');
Jawaban:
Anda perlu menambahkan nilai-nilai dalam array satu per satu.
PEMBARUAN: Berikut adalah solusi yang diperluas dan dapat digunakan kembali yang menggunakan jawaban Adam bersama dengan edit yang disarankannya. Saya memperbaikinya sedikit dan membuatnya menjadi metode ekstensi untuk membuatnya lebih mudah untuk dipanggil.
Ini disebut seperti ini ...
Perhatikan "{Age}" dalam pernyataan sql sama dengan nama parameter yang kami kirim ke AddArrayParameters. AddArrayParameters akan mengganti nilai dengan parameter yang benar.
sumber
var paramPlaceholder = "{" & paramNameRoot & "}";
Debug.Assert(cmd.CommandText.Contains(paramPlaceholder), "Parameter Name Root must exist in the Source Query");
Ini akan membantu devs jika mereka lupa untuk mencocokkan paramNameRoot dengan kueri.Saya ingin memperluas jawaban yang diberikan Brian untuk membuatnya mudah digunakan di tempat lain.
Anda dapat menggunakan fungsi baru ini sebagai berikut:
Sunting: Berikut adalah variasi umum yang berfungsi dengan array nilai jenis apa pun dan dapat digunakan sebagai metode ekstensi:
Anda kemudian dapat menggunakan metode ekstensi ini sebagai berikut:
Pastikan Anda mengatur CommandText sebelum memanggil AddArrayParameters.
Juga pastikan nama parameter Anda tidak akan cocok dengan apa pun di pernyataan Anda (mis. @AgeOfChild)
sumber
AddWithValue
fungsinya, ada kemungkinan Anda bisa memperbaikinya?Jika Anda dapat menggunakan alat seperti "dapper", ini bisa dengan mudah:
Dapper akan menangani pembatalan ini ke parameter individual untuk Anda .
sumber
'{1,2,3}'
argumen style ke fungsi (bukan klausa WHERE IN), tapi saya lebih suka menggunakan ODBC polos jika tidak kerumitan array. Saya kira saya perlu Dapper ODBC juga dalam kasus ini. Inilah yang ingin ia tarik. snipboard.io/HU0RpJ.jpg . Mungkin saya harus membaca lebih lanjut tentang Dapper ...Jika Anda menggunakan MS SQL Server 2008 dan di atasnya, Anda dapat menggunakan parameter bernilai tabel seperti dijelaskan di sini http://www.sommarskog.se/arrays-in-sql-2008.html .
1. Buat tipe tabel untuk setiap tipe parameter yang akan Anda gunakan
Perintah berikut membuat tipe tabel untuk bilangan bulat:
2. Terapkan metode pembantu
3. Gunakan seperti ini
sumber
table.Rows.Add(id);
menghasilkan bau kode kecil saat menggunakan SonarQube. Saya menggunakan alternatif ini di dalam foreach:var row = table.NewRow(); row["id"] = id; table.Rows.Add(row);
.Karena ada metode pada
mungkin lebih nyaman untuk membuat metode yang menerima parameter (nama) untuk diganti dan daftar nilai. Ini bukan pada level Parameter (seperti AddWithValue ) tetapi pada perintah itu sendiri sehingga lebih baik untuk menyebutnya AddParametersWithValues dan bukan hanya AddWithValues :
pertanyaan:
pemakaian:
metode ekstensi:
sumber
Saya ingin mengusulkan cara lain, bagaimana mengatasi keterbatasan dengan operator IN.
Sebagai contoh, kami memiliki permintaan berikut
Kami ingin memberikan beberapa ID untuk memfilter pengguna. Sayangnya itu tidak mungkin dilakukan dengan C # dengan cara mudah. Tapi saya punya sumber solusi untuk ini dengan menggunakan fungsi "string_split". Kami perlu menulis ulang sedikit permintaan kami untuk mengikuti.
Sekarang kita dapat dengan mudah melewati satu enumerasi parameter nilai yang dipisahkan oleh koma.
sumber
Melewati larik item sebagai parameter yang diciutkan ke klausa WHERE..IN akan gagal karena kueri akan berbentuk
WHERE Age IN ("11, 13, 14, 16")
.Tapi Anda bisa meneruskan parameter Anda sebagai array yang diserialisasi ke XML atau JSON:
Menggunakan
nodes()
metode:Menggunakan
OPENXML
metode:Itu sedikit lebih di sisi SQL dan Anda perlu XML yang tepat (dengan root).
Menggunakan
OPENJSON
metode (SQL Server 2016+):Perhatikan bahwa untuk metode terakhir Anda juga harus memiliki Tingkat Kompatibilitas di 130+.
sumber
Gambaran Umum: Gunakan DbType untuk mengatur tipe parameter.
sumber
Gunakan
.AddWithValue()
, jadi:sqlComm.Parameters.AddWithValue("@Age", sb.ToString().TrimEnd(','));
Atau, Anda bisa menggunakan ini:
Sampel kode total Anda akan melihat sebagai berikut:
sumber
Berikut adalah varian kecil dari jawaban Brian yang mungkin berguna bagi orang lain. Mengambil Daftar kunci dan memasukkannya ke daftar parameter.
sumber
mencoba
sumber
coba seperti ini
sumber