দরকারী তথ্য (এবং কিছু ভুল তথ্য) সম্পর্কে ছড়িয়ে পড়া সম্পর্কে এখানে প্রচুর উত্তর রয়েছে, আমি এগুলি সব একসাথে আনতে চাই।
প্রশ্নের সংক্ষিপ্ত উত্তর হ'ল ডিবিএনুলের জন্য পরীক্ষা করা - প্রায় সকলেই এই বিটটিতে একমত হন :)
পরিবর্তে এসকিউএল ডেটা টাইপ করার জন্য কোনও সহায়ক পদ্ধতি ব্যবহার করার পরিবর্তে একটি জেনেরিক পদ্ধতি আমাদের এটিকে অনেক কম কোড দিয়ে সম্বোধন করতে দেয়। যাইহোক, আপনার নিকলযোগ্য মান ধরণের এবং রেফারেন্স উভয় প্রকারের জন্য একটি জেনেরিক পদ্ধতি থাকতে পারে না, এটি জেনেরিক পরামিতি হিসাবে নলযোগ্য প্রকারের দৈর্ঘ্যে আলোচনা করা যেতে
পারে? এবং 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
সবশেষে, সমস্ত এসকিউএল সার্ভারের ডেটা প্রকারের উপরের পদ্ধতিগুলি পরীক্ষা করে আমি আবিষ্কার করেছি যে আপনি সরাসরি স্কেলডিটাআরডিডার থেকে একটি চর [[] পেতে পারবেন না, আপনি যদি চান চান []] আপনাকে একটি স্ট্রিং পেতে এবং টোচারআরে () ব্যবহার করতে হবে।
int colIndex = reader.GetOrdinal(fieldname);
এবং সহজেই @ marc_s এরSafeGetString
ক্রিয়াকলাপটি ওভারলোড করুন ।