কিভাবে dapper.net সাথে লেনদেন ব্যবহার করবেন?


106

আমি একাধিক টেবিলগুলিতে একাধিক statementsোকানো বিবৃতি চালাতে চাই। আমি dapper.net ব্যবহার করছি। আমি ড্যাপার.নেট দিয়ে লেনদেন পরিচালনা করার কোনও উপায় দেখতে পাচ্ছি না।

কীভাবে ড্যাপার.নেটের সাথে লেনদেনগুলি ব্যবহার করবেন সে সম্পর্কে আপনার ধারণাগুলি ভাগ করুন।

উত্তর:


107

এখানে কোড স্নিপেট:

using System.Transactions;    
....    
using (var transactionScope = new TransactionScope())
{
    DoYourDapperWork();
    transactionScope.Complete();
}

নোট করুন যে আপনাকে System.Transactionsসমাবেশে রেফারেন্স যুক্ত করতে হবে কারণ এটি ডিফল্টরূপে উল্লেখ করা হয়নি।


7
ত্রুটি বা স্পষ্টতই আবার সিস্টেমটিকে রোল করা দরকার?
নরবার্ট নবার্টসন

6
@ নরবার্টনবার্টসন Dispose()পদ্ধতিতে এটি স্বয়ংক্রিয়ভাবে এটি করেন । যদি Complete()না ডাকা হয়, তবে লেনদেন আবার ফিরে আসে।
the_জোরিক

4
অন্য জবাব ( স্ট্যাকওভারফ্লো.com / a / 20047975 / 47672 ) এর কারণে উল্লেখ করার মতো মূল্য : TransctionScopeআপনি এই উত্তরটি বেছে নেওয়ার ক্ষেত্রে সংযোগটি অবশ্যই ব্লকটি ব্যবহার করে খোলার দরকার।
0x49D1

2
আরও দেখুন ( stackoverflow.com/a/20047975/444469 ) - DoYouDapperWork (প্রতিপাদন, ক্যোয়ারী, ইত্যাদি ...) পরামিতি লেনদেনের প্রয়োজন।
ম্যাথিউউ

কোনও সমস্যা হলে রোলব্যাকটি কী স্বয়ংক্রিয়ভাবে ডাকা হবে?
গ্যান্ডালফ

91

আমি সরাসরি সংযোগ থেকে লেনদেন পেয়ে আরও স্বজ্ঞাত পন্থা ব্যবহার করতে পছন্দ করেছি:

// This called method will get a connection, and open it if it's not yet open.
using (var connection = GetOpenConnection())
using (var transaction = connection.BeginTransaction())
{
    connection.Execute(
        "INSERT INTO data(Foo, Bar) values (@Foo, @Bar);", listOf5000Items, transaction);
    transaction.Commit();
}

@ আনিভেস: আচ্ছা, আমরা সম্ভবত বিভিন্ন ড্যাপার ফ্রেমওয়ার্ক ব্যবহার করছি, কারণ এটির
andrecarlucci

25
.বিগ্রেস
সময়হীন

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

@ErikBergstedt, আপনি বলছেন যে সংযোগ আবশ্যক খোলা পরই আমরা কল .BeginTransaction()এটা? যদি এটি হয়ে থাকে তবে এই এক্সটেনশন পদ্ধতিটি লেনদেনের ভুল ব্যবহারের প্রচার করবে। (আইএমও, এটি এমনকি "সংযোগটি ইতিমধ্যে খোলার পরেও লেনদেন খুলতে পারে না" নিক্ষেপ করা উচিত))
আনভিস

2
লেনদেনটিকে প্যারামিটার হিসাবে অন্তর্ভুক্ত করার জন্য ভাল পয়েন্ট Execute, এটি যেমন প্রয়োজন।
Systad

19

আপনার ব্যবহার করতে সক্ষম হবেন TransactionScopeযেহেতু ড্যাপার কেবলমাত্র ADO.NET কমান্ড চালায়।

using (var scope = new TransactionScope())
{
   // insert
   // insert
   scope.Complete();
}

8

আপনার সমস্ত সারণী একক ডাটাবেসে রয়েছে বিবেচনা করে, আমি TransactionScopeএখানে কিছু উত্তরের প্রস্তাবিত সমাধানের সাথে একমত নই । পড়ুন এই উত্তর।

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

  2. connection.BeginTransactionএকক ডাটাবেসের বিপরীতে লেনদেন (সি #, ভিবি। নেট ইত্যাদি) বাস্তবায়নের জন্য ADO.NET সিনট্যাক্স। এটি একাধিক ডাটাবেস জুড়ে কাজ করে না।

সুতরাং, connection.BeginTransaction()যেতে ভাল উপায়।

এমনকি লেনদেন পরিচালনার সর্বোত্তম উপায় হ'ল ইউনিট অফ ওয়ার্ককে এই উত্তরে বর্ণিত হিসাবে প্রয়োগ করা ।


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

3
@ ল্যারি স্মিথ: সম্মত; কিন্তু প্রশ্ন এই কিছুই সম্পর্কে নয়। ওপি কেবল বলেছেন যে তিনি একটি লেনদেনে একাধিক টেবিল সন্নিবেশ করতে চান। গৃহীত উত্তর সহ কয়েকটি উত্তর, TransactionScopeওপি যা চায় তার জন্য অদক্ষ যা ব্যবহার করার পরামর্শ দেয় । আমি একমত যে TransactionScopeএটি অনেক ক্ষেত্রে ভাল হাতিয়ার; কিন্তু এই না।
অমিত জোশী

5

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

using System.Transactions;
    // _sqlConnection has been opened elsewhere in preceeding code 
    using (var transactionScope = new TransactionScope())
    {
        try
        {
            long result = _sqlConnection.ExecuteScalar<long>(sqlString, new {Param1 = 1, Param2 = "string"});

            transactionScope.Complete();
        }
        catch (Exception exception)
        {
            // Logger initialized elsewhere in code
            _logger.Error(exception, $"Error encountered whilst executing  SQL: {sqlString}, Message: {exception.Message}")

            // re-throw to let the caller know
            throw;
        }
    } // This is where Dispose is called 

2
@ আরএসআল যা ব্যক্তিগত পছন্দ হিসাবে নেমে আসে। আমি প্রথম বার কিছু ভুল হয়ে গেছে তা জানতে পছন্দ করি এবং লগের বিবৃতিগুলি লিটার হিসাবে দেখি না। এছাড়াও, আমার উত্তর এখনও বিজ্ঞাপনের মূল্য দ্যাপারের সাথে লেনদেনগুলি ব্যবহার করার একটি উপায় প্রদর্শন করে দেখায়
সুধাংশু মিশ্র

@ কোডনেকেড, প্রথমে আপনি সেখানে অর্ডারটি ভুল পেয়েছেন। যদি ব্যতিক্রম না থাকে তবে ক্যাচ ব্লকটি প্রথমে আঘাত হানে, তারপরে ব্যবহারের সুযোগটি শেষ হবে। দ্বিতীয়ত, এই উত্তরটি দেখুন এবং রেফারেন্সড এমএসডিএন ডক: স্ট্যাকওভারফ্লো.com/ a / 5306896 / 190476 কল করা দ্বিতীয় বার নিষ্পত্তি করা ক্ষতিকারক নয়, একটি ভাল নকশাযুক্ত বস্তু দ্বিতীয় কলটিকে উপেক্ষা করে। ডাউনভোটটি ন্যায়সঙ্গত নয়!
সুধাংশু মিশ্র

@ ডটনেটগুয়ে - কোন Disposeপদ্ধতিটিকে প্রথম বা দ্বিতীয় বলা হয় তা আমি যোগাযোগ করার চেষ্টা করিনি , কেবল এটিই দু'বার বলা হয়েছিল। "দ্বিতীয় বার নিষ্পত্তি করা কল্পনা করা ক্ষতিকারক নয়" এমন বিষয়টি, এটি একটি বড় অনুমান। আমি শিখেছি ডক্স এবং প্রকৃত বাস্তবায়ন প্রায়শই একমত হয় না। তবে আপনি যদি এর জন্য মাইক্রোসফ্টের শব্দটি চান: msdn.microsoft.com/en-us/library/…
কোডনেকেড

3
সুতরাং, একটি কোড বিশ্লেষণের সতর্কতা আপনার ডাউনটোট করার কারণ? এটি উত্তর ভুল বা বিভ্রান্তিমূলক করে না - তখনই যখন ডাউনভোট উপযুক্ত হয়। কার্যকারিতাটি বজায় রেখে আপনি কেন উত্তরটি সম্পাদনা করেন না এবং আরও ভাল সমাধানের প্রস্তাব দেন না? স্ট্যাক ওভারফ্লো হ'ল সহায়তা এবং গঠনমূলক সমালোচনা সম্পর্কে।
সুধংশু মিশ্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.