SQLlDataAdapter বনাম SQLDataReader


130

ডিবি থেকে ডেটা পাওয়ার জন্য স্কেলডাটাএডাপ্টার বনাম স্কেলডাটাআরেডার ব্যবহারের মধ্যে পার্থক্যগুলি কী?

আমি বিশেষত তাদের পেশাদার এবং ত্রুটির পাশাপাশি তাদের গতি এবং মেমরির পারফরম্যান্সগুলি অনুসন্ধান করছি।

ধন্যবাদ

উত্তর:


193

SqlDataReader:

  • আপনার সমাপ্ত না হওয়া পর্যন্ত সংযোগটি উন্মুক্ত রাখে (এটি বন্ধ করতে ভুলবেন না!)।
  • সাধারণত একবারে পুনরাবৃত্তি করা যেতে পারে
  • ডাটাবেসে ফিরে আপডেট করার মতো কার্যকর নয়

অন্যদিকে, এটি:

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

SqlDataAdapter / ডেটা সেটটি

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

যে কোন মুল্যে:

  • অনেক বেশি স্মৃতি ব্যবহার
  • এটি ব্যবহার করার আগে সমস্ত ডেটা লোড না হওয়া পর্যন্ত আপনি অপেক্ষা করুন

সুতরাং সত্যিই এটি আপনি যা করছেন তার উপর নির্ভর করে তবে আমি কেবলমাত্র একটি ডেটাসেট দ্বারা সমর্থিত এমন কোনও জিনিস প্রয়োজন না হওয়া পর্যন্ত আমি একটি ডেটা রিডার পছন্দ করি। স্কেলডাটাআরডিডার কেবল পঠনযোগ্য গ্রিডে বাঁধাইয়ের সাধারণ ডেটা অ্যাক্সেসের ক্ষেত্রে উপযুক্ত।

আরও তথ্যের জন্য, মাইক্রোসফ্টের অফিসিয়াল ডকুমেন্টেশন দেখুন


5
ডেটাসেট একটি ইন-মেমরি ডেটাস্টোর, যেখানে ডেটারেডার ডেটা পুনরুদ্ধার করার একটি মাধ্যম মাত্র। হালকা নোটে আপনি লিনক ক্যোয়ারী ডেটাসেটে চালাতে পারেন, তবে কোনও ডেটাডার্ডে নয়।
পার্থ চৌধুরী

আসলে, অতিরিক্ত কোডের সামান্য বিট দিয়ে আপনি অবশ্যই একটি ডেটাডার্ডারে লিনক ক্যোয়ারিগুলি (বা কমপক্ষে একটি ক্যোয়ারী) চালাতে পারেন। আপনার while (reader.Read())লুপের ভিতরে আইডিটাআরকর্ড হিসাবে ডেটাআরডার কাস্ট রিটার্ন প্রদানের জন্য কেবল একটি পুনরুদ্ধারকারী ব্লক ব্যবহার করুন ।
জোয়েল কোহোর্ন 21

7
এই উত্তরটি বিভ্রান্তিকর। যদি আপনি আপনার স্কেল সংযোগ এবং স্কেলডেটাআরডার বস্তুগুলিকে "ব্যবহার করে" স্টেটমেন্টগুলি (আপনার যেমন হওয়া উচিত, যেহেতু তারা আইডেসपोজযোগ্য) এর সাথে আবদ্ধ করেন তবে সংযোগটি স্বয়ংক্রিয়ভাবে বন্ধ হয়ে যাবে। এবং আপনি একটি স্ক্ল্যাডেটাআরডিডার সহ একটি ডেটাসেট ব্যবহার করতে পারেন: কেবল ডেটাসেট.লয়েডকে কল করুন (স্ক্যালডিটাআরডিডার)।
রিকএনজেড

4
@ রিকএনজেড আপনার পক্ষে জিনিসগুলি বন্ধ করতে স্টেটমেন্ট ব্যবহার করে খুব দ্রুত বিশ্বাস করবেন না। এগুলি অবজেক্টের ডিসপোজ () পদ্ধতি বলে, এটি বন্ধ () পদ্ধতি নয়, এবং আমি কমপক্ষে একটি ক্ষেত্রে চলে এসেছি যেখানে ডিসপোজ আমার পক্ষে বস্তুটি বন্ধ করে দেয় না। ব্যবহারের ব্লকের নিকটতম পদ্ধতির কাছে একটি স্পষ্ট কল অন্তর্ভুক্ত করা সর্বদা সেরা।
সিডারাগর্ন

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

17

এর উত্তর বেশ বিস্তৃত হতে পারে।

মূলত, আমার জন্য প্রধান পার্থক্য যা সাধারণত আমার সিদ্ধান্তগুলিকে প্রভাবিত করে যার উপর ব্যবহার করা হয় তা হ'ল কোনও এসকিউএলডাটা রিডার দিয়ে আপনি ডাটাবেস থেকে ডেটা "স্ট্রিমিং" করছেন। একটি এসকিউএলডেটা অ্যাডাপ্টারের সাহায্যে আপনি ডাটাবেস থেকে এমন কোনও বস্তুতে ডেটা বের করছেন যা নিজেই আরও জিজ্ঞাসা করা যেতে পারে, পাশাপাশি সিআরইউডি অপারেশন চালিয়ে যাচ্ছে।

স্পষ্টতই ডেটা স্ট্রিমের সাথে এসকিউএলডেটাআরডারটি খুব দ্রুত, তবে আপনি কেবল একবারে একটি রেকর্ড প্রক্রিয়া করতে পারেন। একটি এসকিউএলডেটা অ্যাডাপ্টারের সাহায্যে আপনার কোডটি দিয়ে / পাস করার জন্য আপনার ডাটাবেস থেকে আপনার প্রশ্নের সাথে মিলে যাওয়া সারিগুলির একটি সম্পূর্ণ সংগ্রহ রয়েছে।

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

আমার ভিবিকে ক্ষমা করুন, তবে এটি স্কেলডাটাআরডার ব্যবহার করার সময় আপনার ন্যূনতম পরিমাণের কোডটি হওয়া উচিত:

Using cn As New SqlConnection("..."), _
      cmd As New SqlCommand("...", cn)

    cn.Open()
    Using rdr As SqlDataReader = cmd.ExecuteReader()
        While rdr.Read()
            ''# ...
        End While
    End Using
End Using     

সমতুল্য সি #:

using (var cn = new SqlConnection("..."))
using (var cmd = new SqlCommand("..."))
{
    cn.Open();
    using(var rdr = cmd.ExecuteReader())
    {
        while(rdr.Read())
        {
            //...
        }
    }
}

যদি আপনার লক্ষ্যটি ডিবিতে একটি নির্বাচিত ক্যোয়ারী ব্যবহার করে ডেটা প্রাপ্ত করা হয় এবং কেবলমাত্র বিভিন্ন সারিতে এই ডেটাটি অ্যাক্সেস করতে হয়, রাইপিয়েইস সারি ইত্যাদিতে যান, তবে আপনি এসকিউএলডেটারিডার ব্যবহার করতে পারেন এবং এটি dtable.Load (rdr) ব্যবহার করে একটি ডেটাবেলে লোড করতে পারেন। তারপরে এই ডেটেবলের মধ্যে ব্রাউজ করুন এবং নীচে। আপনি ডেটা অ্যাডাপ্টারের পরিবর্তে এই পদ্ধতিটি ব্যবহার করতে পারেন ...
পরিবর্তনশীল

14

একটি স্কেলডাটা অ্যাডাপ্টার সাধারণত ডেটাসেট বা ডেটা টেবিল পূরণ করার জন্য ব্যবহৃত হয় এবং তাই আপনার সংযোগ বন্ধ হয়ে যাওয়ার পরে (সংযোগ বিচ্ছিন্ন অ্যাক্সেস) আপনার ডেটাতে অ্যাক্সেস থাকবে।

স্কেলডাটাআডার হ'ল একটি দ্রুত ফরোয়ার্ড এবং সংযুক্ত কার্সার যা সাধারণত ডেটাসেট / ডেটা টেবিল পূরণের চেয়ে দ্রুততর হয়।

তদ্ব্যতীত, একটি SQLDataReader দিয়ে, আপনি আপনার ডেটা একবারে একটি রেকর্ড মোকাবেলা করেন, এবং কোনও ডেটা মেমরিতে রাখেন না। স্পষ্টতই একটি ডেটা টেবিল বা ডেটাসেট দিয়ে আপনার মেমরির বরাদ্দ ওভারহেড করে।

আপনার যদি আপনার ডেটা মেমরির মধ্যে রাখার দরকার না থাকে, তাই কেবল স্টাফ সরবরাহের জন্য, এসকিএলডেটাআরডিডারটিতে যান। আপনি যদি কোনও সংযোগ বিহীন ফ্যাশনে আপনার ডেটা নিয়ে ডিল করতে চান তবে কোনও ডেটাসেট বা ডেটা টেবিল পূরণ করতে ডেটাএডাপ্টারটি চয়ন করুন।


10

ডাটাবেস থেকে ইন-মেমরি ডেটাসেট / ডেটা টেবিলটি পপুল করতে চাইলে একটি স্কেলডিটাএডাপ্টার ব্যবহার করুন। তারপরে আপনি সংযোগটি বন্ধ / নিষ্পত্তি করতে, ডেটাটেবল পাস / মেমরির আশেপাশে সেট করতে নমনীয়তা পাবেন। তারপরে আপনি ইনসেটকমন্ড / আপডেটকম্যান্ডের সাথে একত্রে ডেটা এন্ডিপ্লেটার ব্যবহার করে ডেটা চালিত করতে এবং এটি আবার ডিবিতে জোর করে রাখতে পারেন।

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


0

ফিল ফাংশনটি অভ্যন্তরীণভাবে একটি ডেটা রিডার ব্যবহার করে। যদি আপনার বিবেচনাটি "কোনটি আরও দক্ষ?", তবে কোনও রেকর্ড বাই সংগ্রহ রেকর্ডিংকে জনপ্রিয় করে তোলে এমন টাইট লুপে একটি ডেটা রিডার ব্যবহার করা, ডাটাএডাপ্টার ব্যবহার করার মতো সিস্টেমে একই লোড হওয়ার সম্ভাবনা রয়েছে illফিল।

(System.Data.dll, System.Data.Common.DbDataAdapter, FillIntern।)

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