উত্তর:
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
অথবা
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;
এর উপরে একটি GetName
ফাংশন রয়েছে SqlDataReader
যা কলাম সূচি গ্রহণ করে এবং কলামটির নাম দেয়।
বিপরীতভাবে, এমন একটি রয়েছে GetOrdinal
যা একটি কলামের নাম নেয় এবং কলাম সূচকটি দেয়।
GetOrdinal
নিখুঁত ছিল. আমি খুঁজছিলাম GetName
, কিন্তু আমার সমস্যার সাথে অনেক ক্লিনার সমাধান GetOrdinal
।
আপনি একটি ডেটা রিডার থেকে কলামের নামগুলি পেতে পারেন।
এখানে গুরুত্বপূর্ণ অংশটি রয়েছে:
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
}
ইতিমধ্যে উল্লেখ করা হয়েছে। কেবল একটি লাইনকিউ উত্তর:
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();
দ্বিতীয়টি ক্লিনার এবং আরও দ্রুত। এমনকি যদি আপনি GetSchemaTable
প্রথম পদ্ধতির ক্যাশে করেন তবে অনুসন্ধান খুব ধীর হতে চলেছে।
reader.Cast<IDataRecord>().ToList()
। আমি বিশ্বাস করি আপনি dynamic
সেখানে কীওয়ার্ড পরিবর্তে ব্যবহার করতে পারেন IDataRecord
তবে কোনও সুবিধা ছাড়াই। DataTable
ওয়ানটাইম লোডিং সহজ করার জন্য ডিজাইন করা হয়েছিল, যাতে আপনি এটিও ব্যবহার করতে পারেন তবে চাহিদা মতো লোডিংয়ের সুবিধা হারাবেন (ডেটা রিডার সহ আপনি যে কোনও মুহুর্তে লোডিং বন্ধ করতে পারেন), পছন্দ করুন var dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
। অনেক লাইব্রেরি যা আপনার জন্য এই স্বয়ংক্রিয় করতে পারেন, আছে তাদের এখানে stackoverflow.com/questions/11988441 এবং এখানে stackoverflow.com/questions/1464883
reader.Cast<IEnumerable<dynamic>>
এবং .Cast<dynamic>
, কিন্তু এটা বলছেন, Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
কি আমি ভুল আছে কি? (আমি আপনার উত্সগুলিতে দেখেছি, তবে তাদের কলামের নামটি জানা উচিত, যা আমি করি না)
আপনি যদি কেবল কলামের নাম চান তবে আপনি এটি করতে পারেন:
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"));
}
}
তবে আপনার যদি কেবল একটি সারি প্রয়োজন হয় তবে আমি আমার অ্যাডোহেল্পার সংযোজনটি পছন্দ করি। এই সংযোজনটি দুর্দান্ত যদি আপনার একটি একক লাইন কোয়েরি থাকে এবং আপনি আপনার কোডের ডেটা টেবিলটি ব্যবহার করতে চান না। এটি কলামের নাম এবং মানগুলির একটি সংবেদনশীল অভিধান ফিরিয়ে দিচ্ছে।
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;
একটি খারাপ অভ্যাস।
আমি getSchemaTable পদ্ধতি ব্যবহার করি , যা IDataReader ইন্টারফেসের মাধ্যমে উন্মুক্ত।
একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন:
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;
}
আপনি অবশ্যই পারবেন।
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(" ");
}
}
এটি মূলত: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik থেকে