আমি এখানে বিভিন্ন বিট এবং সঠিক উত্তরের টুকরোগুলি দেখতে পাচ্ছি, তবে আমাকে এগুলি একত্রিত করে কয়েকটি জিনিস ব্যাখ্যা করতে দিন।
প্রথমত, AcceptChanges
কেবলমাত্র কোনও টেবিলে পুরো লেনদেনকে বৈধ ও প্রতিশ্রুতিবদ্ধ হিসাবে চিহ্নিত করতে ব্যবহার করা উচিত। যার অর্থ যদি আপনি বাঁধার জন্য উদাহরণস্বরূপ, কোনও এসকিউএল সার্ভারের জন্য ডেটা টেবিলটিকে ডেটাসোর্স হিসাবে ব্যবহার করেন তবে AcceptChanges
ম্যানুয়ালি কল করা গ্যারান্টি দেয় যে পরিবর্তনগুলি কখনই এসকিউএল সার্ভারে সংরক্ষণ হয় না ।
এই বিষয়টিকে আরও বিভ্রান্তিকর করে তোলে যে বাস্তবে দুটি ক্ষেত্রে ব্যতিক্রম ছুঁড়ে দেওয়া হয়েছে এবং আমাদের উভয়টিকে আটকাতে হবে।
1. একটি আইনিম্যারেবলের কালেকশনটি সংশোধন করা
সংগ্রহের গণনা করাতে আমরা কোনও সূচক যুক্ত করতে বা অপসারণ করতে পারি না কারণ এটি করার ফলে গণকের অভ্যন্তরীণ সূচকে প্রভাবিত হতে পারে। এটিকে ঘুরে দেখার দুটি উপায় রয়েছে: হয় লুপের জন্য নিজের ইন্ডেক্সিং করুন, বা গণনার জন্য আলাদা সংগ্রহ (যা সংশোধিত নয়) ব্যবহার করুন।
2. একটি মুছে ফেলা এন্ট্রি পড়ার চেষ্টা করা
যেহেতু ডেটা টেবিলগুলি লেনদেনের সংগ্রহ, এন্ট্রিগুলি মোছার জন্য চিহ্নিত করা যেতে পারে তবে এখনও গণনায় প্রদর্শিত হয়। যার অর্থ আপনি যদি কলামটির জন্য মুছে ফেলা প্রবেশের কথা জিজ্ঞাসা করেন "name"
তবে এটি একটি ব্যতিক্রম ছুঁড়ে দেবে। যার অর্থ dr.RowState != DataRowState.Deleted
কলাম জিজ্ঞাসা করার আগে আমাদের অবশ্যই তা পরীক্ষা করে দেখতে হবে ।
সবগুলোকে একত্রে রাখ
আমরা অগোছালো হয়ে উঠতে পারি এবং ম্যানুয়ালি সেগুলি সবই করতে পারি, বা আমরা ডাটা টেবিলটিকে আমাদের জন্য সমস্ত কাজ করতে দিতে পারি এবং বিবৃতিটি দেখতে এবং আরও কিছু করে এসকিউএল কলের মতো করতে পারি:
string name = "Joe";
foreach(DataRow dr in dtPerson.Select($"name='{name}'"))
dr.Delete();
ডেটা টেবলের ফাংশনটিতে কল Select
করে, আমাদের ক্যোয়ারী স্বয়ংক্রিয়ভাবে ডেটাটেবেলে মুছে ফেলা প্রবেশগুলি এড়িয়ে চলে। এবং যেহেতু Select
ফাংশনটি ম্যাচের একটি অ্যারে দেয়, তাই আমরা যে সংগ্রহটি গণনা করছি তা কল করার সময় পরিবর্তন করা হয় না dr.Delete()
। কোডটি শোরগোল না করে পরিবর্তনশীল নির্বাচনের অনুমতি দেওয়ার জন্য আমি স্ট্রিং ইন্টারপোলেশন সহ সিলেক্ট এক্সপ্রেশনটিও মশগুল করেছি।
[ii]
করতে[i]
অবশ্য :-)