Jawaban:
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
atau
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
Ada GetName
fungsi SqlDataReader
yang menerima indeks kolom dan mengembalikan nama kolom.
Sebaliknya, ada GetOrdinal
yang mengambil nama kolom dan mengembalikan indeks kolom.
GetOrdinal
sempurna. Saya mencari GetName
, tetapi solusi yang jauh lebih bersih untuk masalah saya GetOrdinal
.
Anda bisa mendapatkan nama kolom dari DataReader.
Inilah bagian penting:
for (int col = 0; col < SqlReader.FieldCount; col++)
{
Console.Write(SqlReader.GetName(col).ToString()); // Gets the column name
Console.Write(SqlReader.GetFieldType(col).ToString()); // Gets the column type
Console.Write(SqlReader.GetDataTypeName(col).ToString()); // Gets the column database type
}
Sudah disebutkan. Hanya jawaban LINQ :
var columns = reader.GetSchemaTable().Rows
.Cast<DataRow>()
.Select(r => (string)r["ColumnName"])
.ToList();
//Or
var columns = Enumerable.Range(0, reader.FieldCount)
.Select(reader.GetName)
.ToList();
Yang kedua lebih bersih dan lebih cepat. Bahkan jika Anda melakukan cache GetSchemaTable
dalam pendekatan pertama, permintaan akan menjadi sangat lambat.
reader.Cast<IDataRecord>().ToList()
. Saya yakin Anda bisa menggunakan dynamic
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), seperti var 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/1464883
reader.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:
List<string> columns = new List<string>();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
{
DataTable dt = reader.GetSchemaTable();
foreach (DataRow row in dt.Rows)
{
columns.Add(row.Field<String>("ColumnName"));
}
}
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.
public static Dictionary<string, string> ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary<string, string> queryParams = null)
{
Dictionary<string, string> CaseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
// Add the parameters for the SelectCommand.
if (queryParams != null)
foreach (var param in queryParams)
cmd.Parameters.AddWithValue(param.Key, param.Value);
using (SqlDataReader reader = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
CaseInsensitiveDictionary.Add(column.ColumnName, row[column].ToString());
}
}
}
}
conn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
return CaseInsensitiveDictionary;
}
throw ex;
adalah praktik terburuk.
Saya menggunakan metode GetSchemaTable , yang diekspos melalui antarmuka IDataReader.
Gunakan metode ekstensi:
public static List<string> ColumnList(this IDataReader dataReader)
{
var columns = new List<string>();
for (int i = 0; i < dataReader.FieldCount; i++)
{
columns.Add(dataReader.GetName(i));
}
return columns;
}
Kamu yakin bisa.
protected void GetColumNames_DataReader()
{
System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=localhost;database=northwind;trusted_connection=true");
System.Data.SqlClient.SqlCommand SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Products", SqlCon);
SqlCon.Open();
System.Data.SqlClient.SqlDataReader SqlReader = SqlCmd.ExecuteReader();
System.Int32 _columncount = SqlReader.FieldCount;
System.Web.HttpContext.Current.Response.Write("SqlDataReader Columns");
System.Web.HttpContext.Current.Response.Write(" ");
for ( System.Int32 iCol = 0; iCol < _columncount; iCol ++ )
{
System.Web.HttpContext.Current.Response.Write("Column " + iCol.ToString() + ": ");
System.Web.HttpContext.Current.Response.Write(SqlReader.GetName( iCol ).ToString());
System.Web.HttpContext.Current.Response.Write(" ");
}
}
Ini berasal dari: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik