Setelah terhubung ke database, bisakah saya mendapatkan nama semua kolom yang dikembalikan di saya SqlDataReader
?
c#
ado.net
sqldatareader
Blankman
sumber
sumber
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Ada
GetName
fungsiSqlDataReader
yang menerima indeks kolom dan mengembalikan nama kolom.Sebaliknya, ada
GetOrdinal
yang mengambil nama kolom dan mengembalikan indeks kolom.sumber
GetOrdinal
sempurna. Saya mencariGetName
, tetapi solusi yang jauh lebih bersih untuk masalah sayaGetOrdinal
.Anda bisa mendapatkan nama kolom dari DataReader.
Inilah bagian penting:
sumber
Sudah disebutkan. Hanya jawaban LINQ :
Yang kedua lebih bersih dan lebih cepat. Bahkan jika Anda melakukan cache
GetSchemaTable
dalam pendekatan pertama, permintaan akan menjadi sangat lambat.sumber
reader.Cast<IDataRecord>().ToList()
. Saya yakin Anda bisa menggunakandynamic
kata kunci di sanaIDataRecord
tetapi tanpa manfaat.DataTable
dirancang untuk memudahkan pemuatan sekali pakai, jadi Anda bisa menggunakannya juga tetapi Anda kehilangan manfaat pemuatan saat diminta (dengan pembaca data Anda bisa berhenti memuat kapan saja), sepertivar dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. Ada banyak perpustakaan yang dapat mengotomatisasi ini untuk Anda, temukan di sini stackoverflow.com/questions/11988441 dan di sini stackoverflow.com/questions/1464883reader.Cast<IEnumerable<dynamic>>
dan.Cast<dynamic>
, tetapi dikatakan,Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
apa yang saya lakukan salah di sana? (Saya melihat sumber Anda, tetapi mereka meminta Anda untuk mengetahui nama kolom, yang saya tidak tahu)Jika Anda hanya menginginkan nama kolom, Anda dapat melakukan:
Tetapi jika Anda hanya perlu satu baris, saya suka penambahan AdoHelper saya. Penambahan ini bagus jika Anda memiliki permintaan satu baris dan Anda tidak ingin berurusan dengan tabel data dalam kode Anda. Ini mengembalikan kamus kasus nama dan nilai kolom tidak sensitif.
sumber
throw ex;
adalah praktik terburuk.Saya menggunakan metode GetSchemaTable , yang diekspos melalui antarmuka IDataReader.
sumber
Gunakan metode ekstensi:
sumber
Kamu yakin bisa.
Ini berasal dari: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
sumber
Lebih mudah untuk mencapainya dalam SQL
sumber