Saya memiliki database SQL Server 2005. Dalam beberapa prosedur, saya memiliki parameter tabel yang saya berikan ke proc tersimpan sebagai nvarchar
(dipisahkan oleh koma) dan secara internal dibagi menjadi nilai-nilai tunggal. Saya menambahkannya ke daftar parameter perintah SQL seperti ini:
cmd.Parameters.Add("@Logins", SqlDbType.NVarchar).Value = "jim18,jenny1975,cosmo";
Saya harus memigrasi database ke SQL Server 2008. Saya tahu bahwa ada parameter nilai tabel, dan saya tahu cara menggunakannya dalam prosedur tersimpan. Tapi saya tidak tahu bagaimana cara mengirimkannya ke daftar parameter dalam perintah SQL.
Adakah yang tahu sintaks Parameters.Add
prosedur yang benar? Atau adakah cara lain untuk melewatkan parameter ini?
c#
sql-server
stored-procedures
sqlcommand
table-valued-parameters
Marek Kwiendacz
sumber
sumber
Jawaban:
DataTable
,,DbDataReader
atauIEnumerable<SqlDataRecord>
objek dapat digunakan untuk mengisi parameter tabel-nilai per artikel MSDN Parameter Tabel-Nilai di SQL Server 2008 (ADO.NET) .Contoh berikut menggambarkan penggunaan salah satu
DataTable
atauIEnumerable<SqlDataRecord>
:Kode SQL :
Kode C # :
sumber
DataTable
sebagai nilai parameter, aturSqlDbType
keStructured
danTypeName
ke database UDT name.null
.CreateSqlDataRecords
tidak akan pernah kembalinull
jika diberiids
parameter kosong .DataTable
(atauDataSet
) hanya mengimplementasikannya karena mereka harus mendukung kemampuan drag & drop di Visual-Studio, sehingga mereka mengimplementasikanIComponent
implementasinyaIDisposable
. Jika Anda tidak menggunakan perancang tetapi membuatnya secara manual, tidak ada alasan untuk membuangnya (atau menggunakanusing
pernyataan). Jadi ini adalah salah satu pengecualian dari aturan emas "buang semua yang mengimplementasikanIDisposable
".Dispose
metode, bahkan jika hanya supaya Analisis Kode tidak akan memperingatkan saya jika saya tidak melakukannya. Tetapi saya setuju bahwa dalam skenario khusus ini di mana basisDataSet
danDataTable
instance digunakan, panggilanDispose
tidak akan melakukan apa-apa.Lebih lanjut untuk jawaban Ryan Anda juga perlu mengatur
DataColumn
'sOrdinal
properti jika Anda berurusan dengantable-valued parameter
dengan beberapa kolom yang ordinals yang tidak dalam urutan abjad.Sebagai contoh, jika Anda memiliki nilai tabel berikut yang digunakan sebagai parameter dalam SQL:
Anda perlu memesan kolom seperti itu di C #:
Jika Anda gagal melakukan ini, Anda akan mendapatkan kesalahan parse, gagal mengubah nvarchar ke int.
sumber
Umum
sumber
Cara terbersih untuk bekerja dengannya. Dengan asumsi tabel Anda adalah daftar bilangan bulat yang disebut "dbo.tvp_Int" (Kustomisasi untuk jenis tabel Anda sendiri)
Buat metode ekstensi ini ...
Sekarang Anda dapat menambahkan parameter nilai tabel dalam satu baris di mana saja hanya dengan melakukan ini:
sumber
if(paramCollection != null)
cek sederhana di bagian atas metode ini akan baikIEnumerable
alih-alihList
di tanda tangan, dengan begitu Anda bisa melewatkan apa pun yang adaIEnumerable
, bukan hanya daftar, Karena Anda tidak menggunakan fungsi spesifik apa punList
, saya tidak benar-benar melihat alasan untuk tidak kamiIEnumerable
Gunakan kode ini untuk membuat parameter yang cocok dari tipe Anda:
sumber