जवाबों:
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
।
आप स्तंभ नाम किसी DataReader से प्राप्त कर सकते हैं।
यहाँ महत्वपूर्ण हिस्सा है:
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
}
पहले ही उल्लेख किया। बस एक 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();
दूसरा एक क्लीनर है और बहुत तेज है। यहां तक कि अगर आप 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"));
}
}
लेकिन अगर आपको केवल एक पंक्ति की आवश्यकता है, तो मुझे मेरा AdoHelper जोड़ पसंद है। यदि आपके पास एकल पंक्ति क्वेरी है और आप कोड में डेटा तालिका के साथ व्यवहार नहीं करना चाहते हैं तो यह जोड़ बहुत अच्छा है। यह कॉलम नाम और मूल्यों के असंवेदनशील शब्दकोश का मामला लौटा रहा है।
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