আপনি কি স্কেলডিটাআরডার থেকে কলামের নামগুলি পেতে পারেন?


276

ডাটাবেসের সাথে সংযুক্ত হওয়ার পরে, আমার যে সমস্ত কলাম ফিরে এসেছিল তার নামটি কি আমি পেতে পারি SqlDataReader?

উত্তর:


460
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();

71
এটি উন্মাদ যে এমন কোনও গণনাকারী ইন্টারফেস নেই যা আপনাকে কলামগুলির মাধ্যমে পুনরাবৃত্তি করতে দেয়।
জনএফএক্স

61
কিছুটা সংক্ষিপ্ত:columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
অ্যালেক্স

2
এটি দুর্দান্ত কাজ করে। আমি আরও জানতে পেরেছিলাম যে কলামের নামটির চারপাশে উদ্ধৃতি ব্যবহার না করা পর্যন্ত আমার কলামের নামগুলি সমস্ত বড় হাতের অক্ষর ছিল। SELECT id AS "MyId" FROM table;
স্টাইলফ্লে

স্যার এটির সমস্ত কলামের নাম ছোট হাতের অক্ষরে ফিরে আসছে। টেবিলের কলামের নামগুলি সবগুলি OBJECTID এর মতো বড় হাতের অক্ষর এবং পাঠক আপত্তিযুক্তের মতো ছোট হাতের অক্ষরে ফিরে আসছেন
মুনিম হাবিব

2
। তার অস্পষ্ট কলাম () স্ট্রিং = Enumerable.Range (0, cTab.FieldCount) .Select হিসাবে (ফাংশন (ঢ) cTab.GetName (ঢ)) ToArray
SWE

77

এর উপরে একটি GetNameফাংশন রয়েছে SqlDataReaderযা কলাম সূচি গ্রহণ করে এবং কলামটির নাম দেয়।

বিপরীতভাবে, এমন একটি রয়েছে GetOrdinalযা একটি কলামের নাম নেয় এবং কলাম সূচকটি দেয়।


3
দুটি কারণ: প্রথমত, মূল পোস্টারটি এখনও কোনও উত্তর চয়ন করে নি, এবং দ্বিতীয়ত, অন্যান্য উত্তরগুলি রয়েছে যা সমস্যার 'সমাধান' এর আরও বিশদ বিবরণ দেয় তবে কার্যকারিতার অস্তিত্ব। ব্যক্তিগতভাবে, আমি স্টিভেন লাইন্সের উত্তরটি সর্বোত্তম পছন্দ করি কারণ এটি কেবল getName সম্পর্কেই কথা বলে না তা ফিল্ডটাইপ এবং ডেটা টাইপেও যায়।
স্টিফেন রাইটন

1
GetOrdinalনিখুঁত ছিল. আমি খুঁজছিলাম GetName, কিন্তু আমার সমস্যার সাথে অনেক ক্লিনার সমাধান GetOrdinal
গুডেয়ে

43

আপনি একটি ডেটা রিডার থেকে কলামের নামগুলি পেতে পারেন।

এখানে গুরুত্বপূর্ণ অংশটি রয়েছে:

  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
  }

15

ইতিমধ্যে উল্লেখ করা হয়েছে। কেবল একটি লাইনকিউ উত্তর:

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
nawfal

আমি চেষ্টা reader.Cast<IEnumerable<dynamic>>এবং .Cast<dynamic>, কিন্তু এটা বলছেন, Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?কি আমি ভুল আছে কি? (আমি আপনার উত্সগুলিতে দেখেছি, তবে তাদের কলামের নামটি জানা উচিত, যা আমি করি না)
ট্র্যাভিস হিটার

6

আপনি যদি কেবল কলামের নাম চান তবে আপনি এটি করতে পারেন:

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;
}

1
throw ex;একটি খারাপ অভ্যাস।
asawyer

2
এর ঠিক উদাহরণ
ইয়াকির মনোর

5
আসোয়ায়ার, আপনার কমপক্ষে কেন বলা উচিত। আমি ধরে নিয়েছি আপনি বলতে যাচ্ছেন যে আপনি "নিক্ষেপ" ব্যবহার করা উচিত; পরিবর্তে যাতে আপনি মূল স্ট্র্যাক ট্রেস বিশদটি হারাবেন না।
ব্রেন্ট রিতেনহাউস

3

আমি getSchemaTable পদ্ধতি ব্যবহার করি , যা IDataReader ইন্টারফেসের মাধ্যমে উন্মুক্ত।



3

একটি এক্সটেনশন পদ্ধতি ব্যবহার করুন:

    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;
    }

2

আপনি অবশ্যই পারবেন।


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 থেকে


1

এটি এসকিউএল এ অর্জন করা আরও সহজ

var columnsList = dbContext.Database.SqlQuery<string>("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'SCHEMA_OF_YOUE_TABLE' AND TABLE_NAME = 'YOUR_TABLE_NAME'").ToList();
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.