এসকিউএল ডেটা রিডার - নাল কলাম মানগুলি পরিচালনা করছে


297

আমি একটি ডাটাবেস থেকে পোকো তৈরি করতে একটি এসকিউএলডেটারিডার ব্যবহার করছি। কোডটি ডাটাবেসে কোনও শূন্য মানের মুখোমুখি হওয়া ব্যতীত কাজ করে। উদাহরণস্বরূপ, যদি ডাটাবেসে ফার্সনাম কলামে নাল মান থাকে তবে একটি ব্যতিক্রম ছুঁড়ে দেওয়া হয়।

employee.FirstName = sqlreader.GetString(indexFirstName);

এই পরিস্থিতিতে নাল মানগুলি হ্যান্ডেল করার সর্বোত্তম উপায় কী?

উত্তর:


470

আপনার জন্য এটি পরীক্ষা করা দরকার IsDBNull:

if(!SqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

এই পরিস্থিতি সনাক্ত এবং পরিচালনা করার জন্য এটি আপনার একমাত্র নির্ভরযোগ্য উপায়।

আমি সেই জিনিসগুলিকে এক্সটেনশন পদ্ধতিগুলিতে মুড়িয়ে ফেলেছি এবং কলামটি যদি সত্যিই থাকে তবে একটি ডিফল্ট মান ফেরানোর ঝোঁক থাকে null:

public static string SafeGetString(this SqlDataReader reader, int colIndex)
{
   if(!reader.IsDBNull(colIndex))
       return reader.GetString(colIndex);
   return string.Empty;
}

এখন আপনি এটিকে কল করতে পারেন:

employee.FirstName = SqlReader.SafeGetString(indexFirstName);

এবং আপনাকে কখনই ব্যতিক্রম বা কোনও nullমান সম্পর্কে চিন্তা করতে হবে না ।


64
কারও যদি সূচকের চেয়ে কলামের নাম প্রয়োজন হয় তবে আপনি এটি করতে পারেন: int colIndex = reader.GetOrdinal(fieldname);এবং সহজেই @ marc_s এর SafeGetStringক্রিয়াকলাপটি ওভারলোড করুন ।
ইলানস

বিশ্বাস করতে পারছি না আমি 2019 এ এসেছি,
ভিবিতেও

এটি এর মতোও করা যেতে পারে: int অর্ডিনাল = রিডার et গেটআর্ডিনাল ("কল_নাম"); uint? ভাল = রিডার।আইএসডিবি নুল (অর্ডিনাল)? (uint?) নাল: রিডার। GETUInt32 (অর্ডিনাল);
এডি

হ্যালো বন্ধুরা! আমি অনুলিপি করার চেষ্টা করে ফর্মটিতে আটকানো এবং একটি ত্রুটি নিয়ে ফিরে এসেছি। "এক্সটেনশন পদ্ধতিটি একটি জেনারিক স্ট্যাটিক শ্রেণিতে সংজ্ঞায়িত করা উচিত"।
জানসান মালাগে

আপনি যদি সেফগেটস্ট্রিং-এর অভ্যন্তরে পাঠক.গেটঅরিন্দাল ব্যবহার করছেন এবং আপনি একটি লুপের মধ্যে সেফগেটস্ট্রিং ব্যবহার করতে চান, তবে পারফরম্যান্স হিট না করে কীভাবে এটি অর্জন করা যায়?
AspUser7724

223

আপনার ডিফল্ট মানগুলির জন্য অপারেটরের asসাথে মিলিত অপারেটরটি ব্যবহার করা উচিত ??। মান প্রকারগুলি শোধনযোগ্য হিসাবে পড়তে হবে এবং একটি ডিফল্ট দেওয়া হবে।

employee.FirstName = sqlreader[indexFirstName] as string;
employee.Age = sqlreader[indexAge] as int? ?? default(int);

asঅপারেটর DBNull জন্য চেক সহ ঢালাই পরিচালনা করে।


6
যদি কেউ বয়সের কলামটি এসকিউএল বিগিন্টের (সি # লম্বা) হয়ে যাওয়া থেকে পরিবর্তন করে থাকে তবে আপনার কোডটি 0 ফিরে এসে নিঃশব্দে ব্যর্থ হবে Z জেডএক্সএক্সের উত্তরটি আরও নির্ভরযোগ্য আইএমও।
মার্টিন আর্দিং-থমসন

আমি অবাক হয়েছি আপনি যদি 0
ক্রিস

5
@ ক্রিস - আপনার কেবলমাত্র -১ এর সাথে ডিফল্ট (পূর্ববর্তী) প্রতিস্থাপন করতে সক্ষম হওয়া উচিত।
স্টিভিওপওয়েল

@ Stevo3000 আপনি সঠিক! আমি এটি চেষ্টা করেছি এবং এটি পোস্ট করার পরে আপনি যেমন বলেছিলেন ঠিক তেমনই কাজ করেছে তবে আমি এই পৃষ্ঠায় ফিরে আসতে ভুলে গিয়েছি :)
ক্রিস

5
সচেতন থাকুন যে এখানে "হিসাবে" ব্যবহার করা ত্রুটিগুলি আড়াল করতে পারে। আপনি যদি দুর্ঘটনাক্রমে ব্যবহার করেন তবে আপনি sqlreader[indexAge] as string ?? ""সর্বদা পাবেন ""(int?)sqlreader[indexAge] ?? defaultValueপরিবর্তে আপনি সত্যিই চান কিনা তা বিবেচনা করুন , সুতরাং আপনার এসকিউএল পরিবর্তিত হলে আপনি খারাপ মানের পরিবর্তে ব্যতিক্রম পান। @ স্টিভো 3000: ডিফল্ট (ইনট) 0, -1 নয়। @ ক্রিস: নিশ্চিত করুন যে আপনি যা চান তা ব্যবহার করছেন।
me22

30

একটি স্ট্রিংয়ের জন্য আপনি কেবল অবজেক্ট সংস্করণ (অ্যারে অপারেটর ব্যবহার করে অ্যাক্সেস করা) কাস্ট করতে পারেন এবং নালগুলির জন্য একটি নাল স্ট্রিং দিয়ে বাতাস করতে পারেন:

employee.FirstName = (string)sqlreader[indexFirstName];

অথবা

employee.FirstName = sqlreader[indexFirstName] as string;

পূর্ণসংখ্যার জন্য, আপনি যদি কোনও শর্ত ছাড়িয়ে যান, তবে আপনি getValueOrDefault () ব্যবহার করতে পারেন

employee.Age = (sqlreader[indexAge] as int?).GetValueOrDefault();

অথবা নাল-কোলেসিং অপারেটর ( ??)।

employee.Age = (sqlreader[indexAge] as int?) ?? 0;

2
আপনার প্রথম উদাহরণ হিসাবে স্পষ্ট কাস্ট কাজ করে না। এটি একই ত্রুটি ছুড়ে
ফেলেছে

@ মুসেফান: আপনার ক্ষেত্রটি আসলে একটি স্ট্রিং? তা না হলে আপনি একটি ভিন্ন ত্রুটি পাবেন। এটি কাজ করে এবং এগুলি উদাহরণ 1 এবং 2 (সিনট্যাক্স বাদে) এর মধ্যে কোনও আসল পার্থক্য নয়।
কোডিং হয়ে গেছে

1
@ গনকোডিং: হ্যাঁ এটি একটি ক্ষারযুক্ত স্ট্রিং এবং দ্বিতীয়টি কাজ করার সময় এটি অবশ্যই প্রথম সমস্যাটির কারণ। আমি কল্পনা করি যে নাল মানগুলি কীভাবে পরিচালনা করা হয় সে কারণে সমস্যাটি দেখা দিয়েছে। হিসাবে হিসাবে, তারা nullপরিবর্তে একটি DBNull অবজেক্ট হয় না । দুটি স্টেটমেন্টের মধ্যে পার্থক্যটি হ'ল প্রথমটি ব্যর্থ হবে যদি এটি স্ট্রিং না হয় তবে দ্বিতীয়টি স্ট্রিং না হলে কেবল নালায় ফিরে আসবে।
মিউজফ্যান

23

IsDbNull(int)সাধারণত GetSqlDateTimeতুলনা করার মতো পদ্ধতিগুলি ব্যবহার করার চেয়ে ধীর গতির হয় DBNull.Value। এর জন্য এই এক্সটেনশন পদ্ধতিগুলি ব্যবহার করে দেখুন SqlDataReader

public static T Def<T>(this SqlDataReader r, int ord)
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return default(T);
    return ((INullable)t).IsNull ? default(T) : (T)t;
}

public static T? Val<T>(this SqlDataReader r, int ord) where T:struct
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? (T?)null : (T)t;
}

public static T Ref<T>(this SqlDataReader r, int ord) where T : class
{
    var t = r.GetSqlValue(ord);
    if (t == DBNull.Value) return null;
    return ((INullable)t).IsNull ? null : (T)t;
}

তাদের এইভাবে ব্যবহার করুন:

var dd = r.Val<DateTime>(ords[4]);
var ii = r.Def<int>(ords[0]);
int nn = r.Def<int>(ords[0]);

5
আমি খুঁজে পেয়েছি যে সিস্টেমে স্পষ্টত অপারেটররা.ডাটা.এসএইচএল টাইপস টাইপগুলি এই কোডটি ব্যবহার করার চেষ্টা করে সর্বত্র ত্রুটি ছুঁড়ে মারছে ...
তেটসুজিন না ওনি

এটি কখনও কখনও কেন ব্যর্থ হয় তার ব্যাখ্যা জন্য stackoverflow.com/a/21024873/1508467 দেখুন (একটি এসকিউএল ইন্টি কলামটি পড়ার জন্য ভাল <int> ব্যবহার করার চেষ্টা করুন)।
রাইস জোন্স

12

এটি করার একটি উপায় হ'ল ডিবি নাল পরীক্ষা করা:

employee.FirstName = (sqlreader.IsDBNull(indexFirstName) 
    ? ""
    : sqlreader.GetString(indexFirstName));

12

reader.IsDbNull(ColumnIndex) অনেক উত্তর হিসাবে কাজ করে।

এবং আমি উল্লেখ করতে চাই যদি আপনি কলামের নাম নিয়ে কাজ করছেন তবে কেবল ধরণের তুলনা করা আরও আরামদায়ক হতে পারে।

if(reader["TeacherImage"].GetType() == typeof(DBNull)) { //logic }


11

আমি মনে করি না একটি নুল কলামের মান আছে, যখন কলামের নামটি ব্যবহার করে কোনও ডেটারিডারের মধ্যে সারিগুলি ফিরে আসে।

আপনি যদি datareader["columnName"].ToString();এটি করেন তবে সর্বদা আপনাকে এমন একটি মান দেয় যা খালি স্ট্রিং হতে পারে ( String.Emptyযদি আপনার তুলনা করার প্রয়োজন হয়)।

আমি নিম্নলিখিতটি ব্যবহার করব এবং খুব বেশি চিন্তা করব না:

employee.FirstName = sqlreader["columnNameForFirstName"].ToString();

4
আপনি একটি পাঠক করতে পারেন [ফিল্ডনাম] == ডিবি নল.ভ্যালু, এনইউএল এর জন্য যাচাই করতে পারেন
রাল্ফ উইলগাস

এটি তারিখের সময়ের মতো স্ট্রাক্টগুলির সাথে কাজ করে না
ট্রান্সফর্মার

11

এই সমাধানটি কম বিক্রেতা-নির্ভর এবং একটি এসকিউএল, ওলেডিবি এবং মাইএসকিউএল রিডার নিয়ে কাজ করে:

public static string GetStringSafe(this IDataReader reader, int colIndex)
{
    return GetStringSafe(reader, colIndex, string.Empty);
}

public static string GetStringSafe(this IDataReader reader, int colIndex, string defaultValue)
{
    if (!reader.IsDBNull(colIndex))
        return reader.GetString(colIndex);
    else
        return defaultValue;
}

public static string GetStringSafe(this IDataReader reader, string indexName)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName));
}

public static string GetStringSafe(this IDataReader reader, string indexName, string defaultValue)
{
    return GetStringSafe(reader, reader.GetOrdinal(indexName), defaultValue);
}

1
এই মুহূর্তে সরাসরি কোনও এক্সটেনশান শ্রেণিতে এই কোডটি অনুলিপি করা ও কাস্টমাইজ করা।
qxotk

8

আমি যা করতে চাই তা হ'ল যথাযথ কিছু দিয়ে SELECT স্টেটমেন্টের নাল মানগুলি প্রতিস্থাপন করা।

SELECT ISNULL(firstname, '') FROM people

এখানে আমি প্রতিটি নালকে ফাঁকা স্ট্রিংয়ের সাথে প্রতিস্থাপন করি। আপনার কোড সেই ক্ষেত্রে ত্রুটিযুক্ত হবে না।


যদি সম্ভব হয় তবে এটিকে নালগুলি এড়িয়ে চলুন। অন্যথায়, আমি সহায়ক পদ্ধতিগুলির সনি বয়ের উত্তর পছন্দ করি।
কোনও রিফান্ড নেই কোনও রিটার্ন নেই

3
একটি স্থিতিশীল, পৃথক সহায়ক পদ্ধতি কেন? SQLDataReader এ কোনও এক্সটেনশন পদ্ধতিটি কি আরও বাধ্য এবং আরও স্বজ্ঞাত বলে মনে হচ্ছে না ??
marc_s

7

নাল পরীক্ষা করার জন্য আপনি একটি জেনেরিক ফাংশন লিখতে পারেন এবং এটি শূন্য হলে ডিফল্ট মান অন্তর্ভুক্ত করতে পারেন। ডেটারিয়াডার পড়ার সময় এটিকে কল করুন

public T CheckNull<T>(object obj)
        {
            return (obj == DBNull.Value ? default(T) : (T)obj);
        }

ডেটারিডার ব্যবহার করার সময় ব্যবহার করুন

                        while (dr.Read())
                        {
                            tblBPN_InTrRecon Bpn = new tblBPN_InTrRecon();
                            Bpn.BPN_Date = CheckNull<DateTime?>(dr["BPN_Date"]);
                            Bpn.Cust_Backorder_Qty = CheckNull<int?>(dr["Cust_Backorder_Qty"]);
                            Bpn.Cust_Min = CheckNull<int?>(dr["Cust_Min"]);
                         }

6

sqlreader.IsDBNull(indexFirstName)এটি পড়ার চেষ্টা করার আগে পরীক্ষা করুন।


4

কিভাবে সাহায্যকারী পদ্ধতি তৈরি সম্পর্কে

স্ট্রিং জন্য

private static string MyStringConverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return "";

        return o.ToString();
    }

ব্যবহার

MyStringConverter(read["indexStringValue"])

ইন্টের জন্য

 private static int MyIntonverter(object o)
    {
        if (o == DBNull.Value || o == null)
            return 0;

        return Convert.ToInt32(o);
    }

ব্যবহার

MyIntonverter(read["indexIntValue"])

তারিখ জন্য

private static DateTime? MyDateConverter(object o)
    {
        return (o == DBNull.Value || o == null) ? (DateTime?)null : Convert.ToDateTime(o);
    }

ব্যবহার

MyDateConverter(read["indexDateValue"])

দ্রষ্টব্য: তারিখটাইম হিসাবে হিসাবে ভেরিয়ালব ঘোষণা করুন

DateTime? variable;

4

Marc_s এর উত্তরের সংযোজন হিসাবে, আপনি স্কেলডাটাআরডিডার থেকে মান পেতে আরও জেনেরিক এক্সটেনশন পদ্ধতি ব্যবহার করতে পারেন:

public static T SafeGet<T>(this SqlDataReader reader, int col)
    {
        return reader.IsDBNull(col) ? default(T) : reader.GetFieldValue<T>(col);
    }

আমি এই পদ্ধতিটিকে "সেফগেট" বলব না কারণ টি যদি স্ট্রাক্ট হয় তবে এটি নালগুলি টি-এর জন্য নন-নাল ডিফল্টে রূপান্তরিত করবে - সত্যই নিরাপদ নয়। সম্ভবত "getValueOrDefault"।
রাইস জোনস

@ রাইজজোনস এই ক্ষেত্রে আপনার স্ট্রাকচার হিসাবে টি কেন থাকবে? এমনকি যদি আপনি এটি করেন তবে আমি যুক্তি দেব যে স্ট্রাক্টে নন-নাল ডিফল্টটি প্রত্যাশিত আচরণ।
গেপসাইচড

@ রাইজজোনস তবে আমি সম্মত হই যে এই পদ্ধতিটি নিরাপদ নাও হতে পারে, এর জন্য স্ক্ল্যাডাটাআরেডার থেকে অবৈধকাস্টএক্সসেপশন এর মতো ব্যতিক্রমগুলি পরিচালনা করা দরকার।
46

4

গেটসচাইডের উত্তর থেকে প্রভাবিত করে , আমি একটি জেনেরিক পদ্ধতি তৈরি করেছি যা এর নাম অনুসারে কলামের মান পরীক্ষা করে

public static T SafeGet<T>(this System.Data.SqlClient.SqlDataReader reader, string nameOfColumn)
{
  var indexOfColumn = reader.GetOrdinal(nameOfColumn);
  return reader.IsDBNull(indexOfColumn) ? default(T) : reader.GetFieldValue<T>(indexOfColumn);
}

ব্যবহার:

var myVariable = SafeGet<string>(reader, "NameOfColumn")

তুমি কে আমি জানি না, তবে তোমাকে আশীর্বাদ করব। এই ফাংশনটি তিন ঘন্টা কাজেরও বেশি সাশ্রয় করেছে।
রমনীক সিং

3

আমি মনে করি আপনি ব্যবহার করতে চান:

SqlReader.IsDBNull(indexFirstName)

2

আমরা আমাদের ডেটা পাঠকদের সমস্ত মানকে টেনে আনার জন্য অবিরাম স্ট্যাটিক পদ্ধতি ব্যবহার করি। সুতরাং এই ক্ষেত্রে আমরা কল করব DBUtils.GetString(sqlreader(indexFirstName)) স্ট্যাটিক / ভাগ করা পদ্ধতিগুলি তৈরি করার সুবিধাটি হ'ল আপনাকে বারবার একই পরীক্ষা করতে হবে না ...

স্থির পদ্ধতিতে নালগুলি পরীক্ষা করার জন্য কোড থাকবে (এই পৃষ্ঠায় অন্যান্য উত্তর দেখুন)।


2

আপনি শর্তসাপেক্ষ অপারেটর ব্যবহার করতে পারেন:

employee.FirstName = sqlreader["indexFirstName"] != DBNull.Value ? sqlreader[indexFirstName].ToString() : "";

নীচের উত্তরগুলির মতো একই, তবে 8 বছর পিছনে!
বেরেকহোল

2

দরকারী তথ্য (এবং কিছু ভুল তথ্য) সম্পর্কে ছড়িয়ে পড়া সম্পর্কে এখানে প্রচুর উত্তর রয়েছে, আমি এগুলি সব একসাথে আনতে চাই।

প্রশ্নের সংক্ষিপ্ত উত্তর হ'ল ডিবিএনুলের জন্য পরীক্ষা করা - প্রায় সকলেই এই বিটটিতে একমত হন :)

পরিবর্তে এসকিউএল ডেটা টাইপ করার জন্য কোনও সহায়ক পদ্ধতি ব্যবহার করার পরিবর্তে একটি জেনেরিক পদ্ধতি আমাদের এটিকে অনেক কম কোড দিয়ে সম্বোধন করতে দেয়। যাইহোক, আপনার নিকলযোগ্য মান ধরণের এবং রেফারেন্স উভয় প্রকারের জন্য একটি জেনেরিক পদ্ধতি থাকতে পারে না, এটি জেনেরিক পরামিতি হিসাবে নলযোগ্য প্রকারের দৈর্ঘ্যে আলোচনা করা যেতে পারে? এবং C # এর সবকিছু nullable জন্য জেনেরিক টাইপ বাধ্যতা

সুতরাং, জেডএক্সএক্সএক্স এবং @ গেটস্পাইচের উত্তরগুলি অনুসরণ করে আমরা এর সাথে শেষ করেছি, অযোগ্য মান পাওয়ার 2 টি পদ্ধতি এবং আমি নন-নাল মানগুলির জন্য একটি তৃতীয় যোগ করেছি (এটি পদ্ধতি নামকরণের ভিত্তিতে সেটটি সম্পূর্ণ করে)।

public static T? GetNullableValueType<T>(this SqlDataReader sqlDataReader, string columnName) where T : struct
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.IsDBNull(columnOrdinal) ? (T?)null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

public static T GetNullableReferenceType<T>(this SqlDataReader sqlDataReader, string columnName) where T : class
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.IsDBNull(columnOrdinal) ? null : sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

public static T GetNonNullValue<T>(this SqlDataReader sqlDataReader, string columnName)
{
    int columnOrdinal = sqlDataReader.GetOrdinal(columnName);
    return sqlDataReader.GetFieldValue<T>(columnOrdinal);
}

আমি সাধারণত কলামের নাম ব্যবহার করি, আপনি যদি কলাম সূচি ব্যবহার করেন তবে এগুলি পরিবর্তন করুন। এই পদ্ধতির নামের উপর ভিত্তি করে আমি বলতে পারি যে আমি দীর্ঘদিন আগে লিখিত কোডটি দেখার সময় ডেটাটি আড়ালযোগ্য হবে কিনা তা বেশ দরকারী ing

পরামর্শ;

  • ডাটাবেসে nullaable কলাম না থাকা এই সমস্যা এড়ানো। আপনার যদি ডাটাবেসের উপর নিয়ন্ত্রণ থাকে তবে কলামগুলি ডিফল্টরূপে নন-নাল হওয়া উচিত এবং যেখানে প্রয়োজন সেখানে কেবল নলাবদ্ধ হওয়া উচিত।
  • অপারেটর হিসাবে সি # 'দিয়ে ডাটাবেস মানগুলি কাস্ট করবেন না কারণ কাস্ট যদি ভুল হয় তবে এটি নিঃশব্দে বাতিল হয়ে যাবে will
  • একটি ডিফল্ট মান অভিব্যক্তি ব্যবহার করে ডাটাবেস শূন্যস্থানগুলিকে ইনট, ডেটটাইম, বিট ইত্যাদির মান ধরণের জন্য নন-নাল মানগুলিতে পরিবর্তন করবে value

সবশেষে, সমস্ত এসকিউএল সার্ভারের ডেটা প্রকারের উপরের পদ্ধতিগুলি পরীক্ষা করে আমি আবিষ্কার করেছি যে আপনি সরাসরি স্কেলডিটাআরডিডার থেকে একটি চর [[] পেতে পারবেন না, আপনি যদি চান চান []] আপনাকে একটি স্ট্রিং পেতে এবং টোচারআরে () ব্যবহার করতে হবে।


1

আমি কোনও ডেটেবলের মধ্যে পড়া একটি এক্সেল শীটে নাল সেলগুলি হ্যান্ডেল করতে নীচে তালিকাভুক্ত কোডটি ব্যবহার করছি।

if (!reader.IsDBNull(2))
{
   row["Oracle"] = (string)reader[2];
}

1
private static void Render(IList<ListData> list, IDataReader reader)
        {
            while (reader.Read())
            {

                listData.DownUrl = (reader.GetSchemaTable().Columns["DownUrl"] != null) ? Convert.ToString(reader["DownUrl"]) : null;
                //没有这一列时,让其等于null
                list.Add(listData);
            }
            reader.Close();
        }

1

এবং / অথবা অ্যাসাইনমেন্ট সহ টার্নারি অপারেটর ব্যবহার করুন:

employee.FirstName = rdr.IsDBNull(indexFirstName))? 
                     String.Empty: rdr.GetString(indexFirstName);

প্রতিটি সম্পত্তি ধরণের জন্য উপযুক্ত হিসাবে ডিফল্ট (যখন নাল) মান প্রতিস্থাপন করুন ...


1

এই পদ্ধতিটি সূচকপ্রথমের উপর নির্ভরশীল যা শূন্য-ভিত্তিক কলামের অর্ডিনাল হওয়া উচিত।

if(!sqlReader.IsDBNull(indexFirstName))
{
  employee.FirstName = sqlreader.GetString(indexFirstName);
}

আপনি যদি কলাম সূচকটি না জানেন তবে একটি নাম পরীক্ষা করতে চান না তবে আপনি পরিবর্তে এই এক্সটেনশন পদ্ধতিটি ব্যবহার করতে পারেন:

public static class DataRecordExtensions
{
    public static bool HasColumn(this IDataRecord dr, string columnName)
    {
        for (int i=0; i < dr.FieldCount; i++)
        {
            if (dr.GetName(i).Equals(columnName, StringComparison.InvariantCultureIgnoreCase))
                return true;
        }
        return false;
    }
}

এবং এই পদ্ধতিটি ব্যবহার করুন:

if(sqlReader.HasColumn("FirstName"))
{
  employee.FirstName = sqlreader["FirstName"];
}

1

পুরানো প্রশ্ন তবে সম্ভবত এখনও কারও উত্তর দরকার

বাস্তবে আমি এই ইস্যুটির মতো কাজ করেছি

ইনটি জন্য:

public static object GatDataInt(string Query, string Column)
    {
        SqlConnection DBConn = new SqlConnection(ConnectionString);
        if (DBConn.State == ConnectionState.Closed)
            DBConn.Open();
        SqlCommand CMD = new SqlCommand(Query, DBConn);
        SqlDataReader RDR = CMD.ExecuteReader();
        if (RDR.Read())
        {
            var Result = RDR[Column];
            RDR.Close();
            DBConn.Close();
            return Result;
        }
        return 0;
    }

স্ট্রিংয়ের জন্য একই "" "0" র পরিবর্তে "" ফিরে আসবে কারণ খালি স্ট্রিং

যাতে আপনি এটি পছন্দ মত ব্যবহার করতে পারেন

int TotalPoints = GatDataInt(QueryToGetTotalPoints, TotalPointColumn) as int?;

এবং

string Email = GatDatastring(QueryToGetEmail, EmailColumn) as string;

খুব নমনীয় যাতে আপনি কোনও কলাম পড়তে যে কোনও প্রশ্নের সন্নিবেশ করতে পারেন এবং এটি ত্রুটি দিয়ে কখনই ফিরে আসবে না


0

এখানে সহায়ক শ্রেণি রয়েছে যা অন্যরা যদি @marc_s উত্তরের ভিত্তিতে প্রয়োজন হয় তবে তা ব্যবহার করতে পারে:

public static class SQLDataReaderExtensions
    {
        public static int SafeGetInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? 0 : dataReader.GetInt32(fieldIndex);
        }

        public static int? SafeGetNullableInt(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as int?;
        }

        public static string SafeGetString(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? string.Empty : dataReader.GetString(fieldIndex);
        }

        public static DateTime? SafeGetNullableDateTime(this SqlDataReader dataReader, string fieldName)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.GetValue(fieldIndex) as DateTime?;
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName)
        {
            return SafeGetBoolean(dataReader, fieldName, false);
        }

        public static bool SafeGetBoolean(this SqlDataReader dataReader, string fieldName, bool defaultValue)
        {
            int fieldIndex = dataReader.GetOrdinal(fieldName);
            return dataReader.IsDBNull(fieldIndex) ? defaultValue : dataReader.GetBoolean(fieldIndex);
        }
    }


-2

আপনি কখনও এই জন্য পরীক্ষা করতে পারেন

if(null !=x && x.HasRows)
{ ....}

-1 এটি বিন্দু নয়: আমরা নাল কলাম মানটির ক্ষেত্রে পরিচালনা করছি, শূন্য বা খালি নয়SqlDataReader
নীলাভ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.