নাল এবং সিস্টেমের মধ্যে পার্থক্য কী? ডিবি নল.ভ্যালু?


92

নাল এবং সিস্টেমের মধ্যে কি কোনও পার্থক্য রয়েছে? যদি হ্যাঁ, এটি কি?

আমি এখন এই আচরণ লক্ষ্য করেছি -

while (rdr.Read())
{
    if (rdr["Id"] != null) //if (rdr["Id"] != System.DBNull.Value)  
    {
        int x = Convert.ToInt32(rdr["Id"]);
    }
}

আমি, ডাটাবেজ একটি SQL datareader ব্যবহার থেকে তথ্য উদ্ধার করার সময় যদিও ফিরে কোনো মূল্যই নেই if(rdr["Id"] != null)ফিরে trueএবং শেষ পর্যন্ত পূর্ণসংখ্যা হিসাবে একটি নাল কাস্ট করার জন্য একটি ব্যতিক্রম ফেলে দিল।

তবে, আমি যদি if (rdr["Id"] != System.DBNull.Value)রিটার্ন ব্যবহার করি false

নাল এবং সিস্টেমের মধ্যে পার্থক্য কী? ডিবি নল.ভ্যালু?


ঠিক আছে, তারা সম্পর্কিত নয়। একটি হ'ল একটি শ্রেণীর স্থির দৃষ্টান্ত System.Data, এবং অন্যটি একটি বিশেষ মান যা কোনও রেফারেন্সের অভাবকে বোঝায়। একে অপরের সাথে তাদের কিছু করার নেই। আপনি কী সম্পর্কে বিভ্রান্ত হয়ে গেছেন তা বিস্তারিত বলতে পারেন? আপনার আসল প্রশ্ন হল "কেন DataRowsএবং DataReadersকরা DBNull.Valueপরিবর্তে নিজেদের ভিতরে null?"
এমকিপিপি

ঠিক আছে, আমার এটি প্রাথমিকভাবে ছিল না তবে আপনি যা বলেছেন তা শিখার পরে আমি কৌতূহলী। আপনি কি আমাকে বলতে পারবেন যে ডেটারো এবং ডেটা রাইডাররা কেন নালার পরিবর্তে ডিবিএনল.ভ্যালুকে নিজের মধ্যে রাখে?
প্যাভনারড

আমি নিজেই নিশ্চিত নই এখানে একটি উত্তর: স্ট্যাকওভারফ্লো / প্রশ্নগুলি / 88৪৮7272727/ কি- এটি- এটি- পয়েন্ট- এর- ডিবিএনুল/… এটিও সম্ভব যে, অবিচ্ছিন্ন মূল্যের ধরণগুলি সি # তে থাকা আগে, এটি মোকাবেলা করার ক্ষেত্রে আরও ঝামেলা হত null
এমকিপিপি

4
আমি কোন উত্তর এখানে ছিল, কিন্তু আমি বুঝতে পেরেছি এটা জন্য আরো উপযুক্ত ছিল stackoverflow.com/questions/4488727/what-is-the-point-of-dbnull - তাই আমি এটা সরানো
মার্ক Gravell

উত্তর:


118

ঠিক আছে, nullকোনও ধরণের উদাহরণ নয়। বরং এটি একটি অবৈধ রেফারেন্স।

যাইহোক, System.DbNull.Valueএটি একটি উদাহরণের জন্য একটি বৈধ রেফারেন্স System.DbNull( System.DbNullএটি একটি সিঙ্গলটন এবং System.DbNull.Valueআপনাকে সেই শ্রেণীর একক উদাহরণের জন্য একটি রেফারেন্স দেয়) যা ডাটাবেসে অস্তিত্বহীন * মানগুলিকে উপস্থাপন করে।

* আমরা সাধারণত বলব null, তবে আমি বিষয়টি গুলিয়ে দিতে চাই না।

সুতরাং, উভয় মধ্যে একটি বড় ধারণাগত পার্থক্য আছে। কীওয়ার্ডটি nullএকটি অবৈধ রেফারেন্স উপস্থাপন করে। ক্লাসটি System.DbNullএকটি ডাটাবেস ক্ষেত্রে একটি অস্তিত্বের মান উপস্থাপন করে। সাধারণভাবে, আমাদের দুটি একই জিনিসকে এড়িয়ে চলার চেষ্টা করা উচিত (এক্ষেত্রে null) দুটি খুব ভিন্ন ধারণার প্রতিনিধিত্ব করতে (এই ক্ষেত্রে একটি ডাটাবেস ক্ষেত্রে অস্তিত্বের তুলনায় একটি অবৈধ রেফারেন্স)।

মনে রাখবেন, এ কারণেই প্রচুর লোক সাধারণভাবে নাল বস্তুর প্যাটার্নটি ব্যবহার করার পক্ষে পরামর্শ দেয় যা এর System.DbNullউদাহরণ।


43
+1 একটি ব্যবহারিক উদাহরণ: আপনি যদি ব্যবহার করেন তবে IDbCommand.ExecuteScalar()এটি হয় নাল (কোনও রেকর্ড ফেরেনি) বা DbNull(প্রথম রেকর্ডের প্রথম কলামটি একটি 'অস্তিত্বের মান') ফিরে আসতে পারে। DbNullআপনি ছাড়া অন্য একটি থেকে পার্থক্য করতে সক্ষম হবে না।
সি এভেনহুইস

আমি এমন একটি ভাষা ব্যবহারের জন্য দৃ strongly়ভাবে সুপারিশ করব যা নুলের ব্যবহার নিষিদ্ধ করে এবং একেবারে 0 অতিরিক্ত ব্যয় করে does জীবন খুব ছোট "নাল বস্তুর প্যাটার্ন" জন্য
নিকোলাস

4
একটি নাল রেফারেন্স পুরোপুরি বৈধ। ☺
IllidanS4 0

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

21

ডিবি নুল ক্লাসের ডকুমেন্টেশন থেকে :

কোনও ডিবিএনল অবজেক্টের সাথে কোনও অবজেক্ট-ভিত্তিক প্রোগ্রামিং ভাষায় নাল ধারণাটি বিভ্রান্ত করবেন না। কোনও অবজেক্ট-ওরিয়েন্টেড প্রোগ্রামিং ল্যাঙ্গুয়েজে নাল অর্থ কোনও অবজেক্টের রেফারেন্সের অনুপস্থিতি। DBNull একটি অস্বীকারহীন বৈকল্পিক বা অস্তিত্বহীন ডাটাবেস কলাম উপস্থাপন করে।


11

DBNull.Value সামলাতে বিরক্তিকর।

আমি স্থিতিশীল পদ্ধতি ব্যবহার করি যা এটি DBNull কিনা তা পরীক্ষা করে এবং তারপরে মানটি ফিরিয়ে দেয়।

SqlDataReader r = ...;
String firstName = getString(r[COL_Firstname]);

private static String getString(Object o) {
   if (o == DBNull.Value) return null;
   return (String) o;
}

এছাড়াও, ডাটাআরওতে মান সন্নিবেশ করার সময়, আপনি "নাল" ব্যবহার করতে পারবেন না, আপনাকে ডিবিএনল.ভ্যালু ব্যবহার করতে হবে।

"নাল" এর দুটি উপস্থাপনা হ'ল আপাত কোনও লাভের জন্য একটি খারাপ নকশা।


4
বিদ্বেষের অনুভূতি যা আমরা আবার ভাগ করি: আপনার শেষ বিবৃতিটি কেবল এখানে পড়ার জন্য এখানে দেখানো এবং আপনার ব্যবহারকারীর
নামটি

5

.NET ডাটাবেস সরবরাহকারীরা ডাটাবেসে শূন্য প্রবেশের প্রতিনিধিত্ব করতে ফিরে আসে। DBNull.Value নাল নয় এবং একটি ডাটাবেস সারি থেকে প্রাপ্ত কলামের মানগুলির জন্য নাল তুলনা করা কার্যকর হবে না, আপনার সর্বদা DBNull.Value এর সাথে তুলনা করা উচিত।

http://msdn.microsoft.com/en-us/library/system.dbnull.value.aspx


PS ডাটাবেসে নাল প্যারামিটারটি পাস করার জন্য আপনার DBNull.Value ব্যবহার করা উচিত, অন্যথায় প্যারামিটারটি পাস না হওয়ায় এটি ব্যাখ্যা করা যেতে পারে।
জেমস মাইকেল হরে 14

4
DBNull হয় না "কি ডাটাবেসের আয়" - এটা শুধু এটি কিভাবে ব্যাখ্যা করা ADO.NET পছন্দ করে; ব্যক্তিগতভাবে আমি নিশ্চিত নই যে এই ব্যাখ্যাটি খুব মূল্যবান
মার্ক গ্র্যাভেল

@ মার্কগ্রাভেল হ্যাঁ, মার্ক, আপনি সঠিক আছেন। আমি এটি ভুলভাবে বলেছি। এএসপি.এনইটি ডাটাবেস নাল কলামের মানটি ডিবি নল.ভ্যালুতে অনুবাদ করে
জেমস মাইকেল হরে

3

ডাটাআরোর একটি পদ্ধতি রয়েছে যা ডাকা হয় IsNull()যা আপনি কলামটি পরীক্ষা করতে ব্যবহার করতে পারেন যদি এটির নাল মান থাকে - এটি নাল সম্পর্কিত যা এটি ডাটাবেসের মাধ্যমে দেখা যায় regarding

DataRow["col"]==nullসবসময় হবে false

ব্যবহার

DataRow r;
if (r.IsNull("col")) ...

পরিবর্তে.


3

নাল সি ++ এর শূন্য পয়েন্টারের সমান । সুতরাং এটি একটি রেফারেন্স যা কোনও মানকে নির্দেশ করে না

DBNull.Valueসম্পূর্ণ আলাদা এবং এটি একটি ধ্রুবক যা ফিরিয়ে দেওয়া হয় যখন ক্ষেত্রের মানটিতে NULL থাকে।

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