Microsoft Technologies Native SQL এবং Stored Procedure কনফিগার করা গাইড ও নোট

336

NHibernate তে Native SQL এবং Stored Procedure ব্যবহার করার মাধ্যমে আপনি ডেটাবেসের সাথে আরও উন্নত এবং কাস্টম কোয়েরি অপারেশন করতে পারেন। NHibernate ডিফল্টভাবে HQL (Hibernate Query Language) এবং LINQ সমর্থন করে, তবে কিছু ক্ষেত্রে আপনাকে ডেটাবেসের সাথে সরাসরি যোগাযোগের জন্য Native SQL অথবা Stored Procedure ব্যবহার করতে হতে পারে।

এখানে Native SQL এবং Stored Procedure কিভাবে কনফিগার এবং ব্যবহার করতে হয় তা আলোচনা করা হবে।


Native SQL ব্যবহার করা

Native SQL হল সরাসরি ডেটাবেসে লেখা SQL কোয়েরি যা NHibernate এর নিজস্ব হাইব্রিড কুয়েরি ল্যাঙ্গুয়েজের বাইরে কাজ করে। এটি যখন ব্যবহার করা হয়, তখন NHibernate ডেটাবেসের সঠিক SQL কোড ব্যবহার করবে।

Native SQL এর মাধ্যমে Query Execution

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    var query = session.CreateSQLQuery("SELECT * FROM Employee WHERE Age > :age")
                       .SetParameter("age", 25);

    var employees = query.List<Employee>();

    foreach (var employee in employees)
    {
        Console.WriteLine($"Employee Name: {employee.Name}, Age: {employee.Age}");
    }
}

এখানে:

  • CreateSQLQuery() মেথড ব্যবহার করা হয়েছে, যেখানে আপনি সরাসরি SQL কোড দিতে পারেন।
  • SetParameter() মেথডের মাধ্যমে SQL কোয়েরিতে প্যারামিটার পাস করা হয়েছে (এখানে :age প্যারামিটারটি 25 দিয়ে সেট করা হয়েছে)।

Native SQL এর মাধ্যমে Result Mapping

যদি আপনার কোয়েরি শুধুমাত্র কিছু কাস্টম ডেটা রিটার্ন করে এবং সেই ডেটা আপনার Entity Class এর সাথে ম্যাচ না করে, তাহলে আপনি Tuple অথবা Object[] ব্যবহার করে ডেটা রিটার্ন করতে পারেন।

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    var query = session.CreateSQLQuery("SELECT Name, Age FROM Employee WHERE Position = :position")
                       .SetParameter("position", "Software Developer");

    var result = query.List<object[]>();  // Result will be in the form of Object array

    foreach (var row in result)
    {
        var name = row[0];
        var age = row[1];
        Console.WriteLine($"Name: {name}, Age: {age}");
    }
}

এখানে:

  • কোয়েরি থেকে Object[] আউটপুট পাওয়া যাবে, যেখানে প্রথম কলাম হবে Name এবং দ্বিতীয় কলাম হবে Age

Stored Procedure ব্যবহার করা

Stored Procedure একটি ডেটাবেস অবজেক্ট যা একটি বা একাধিক SQL অপারেশনকে একত্রিত করে। NHibernate তে Stored Procedure কল করতে আপনি CreateSQLQuery() মেথডের মাধ্যমে এটি করতে পারেন।

Stored Procedure কল করা

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    var query = session.CreateSQLQuery("EXEC GetEmployeesByPosition :position")
                       .SetParameter("position", "Software Developer");

    var employees = query.List<Employee>();  // Map the result to Employee entities

    foreach (var employee in employees)
    {
        Console.WriteLine($"Employee Name: {employee.Name}, Age: {employee.Age}");
    }
}

এখানে:

  • EXEC GetEmployeesByPosition হল একটি Stored Procedure যা position প্যারামিটার নিয়ে কাজ করবে।
  • SetParameter() মেথড দিয়ে Stored Procedure এর প্যারামিটার পাস করা হচ্ছে।
  • List() ব্যবহার করে ফলাফলকে Employee এনটিটির মধ্যে ম্যাপ করা হচ্ছে।

Stored Procedure Result Mapping

এখন যদি আপনি একটি Stored Procedure এর মাধ্যমে এমন ডেটা পেতে চান যা Entity Class এর সাথে পুরোপুরি মিলে না, তাহলে আপনি DTO (Data Transfer Object) বা অন্য কোনো Custom Object তৈরি করতে পারেন এবং সেই Object তে মাপসই ডেটা রাখতে পারেন।

public class EmployeeDTO
{
    public string Name { get; set; }
    public int Age { get; set; }
}

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    var query = session.CreateSQLQuery("EXEC GetEmployeeDetails")
                       .AddScalar("Name", NHibernateUtil.String)
                       .AddScalar("Age", NHibernateUtil.Int32);

    var result = query.List<object[]>();  // Use Object[] to get the result

    var employees = result.Select(row => new EmployeeDTO
    {
        Name = (string)row[0],
        Age = (int)row[1]
    }).ToList();

    foreach (var employee in employees)
    {
        Console.WriteLine($"Name: {employee.Name}, Age: {employee.Age}");
    }
}

এখানে:

  • AddScalar() ব্যবহার করে SQL কোয়েরির আউটপুট কলামগুলোকে DTO তে ম্যাপ করা হচ্ছে।
  • List<object[]> থেকে DTO তৈরি করা হচ্ছে এবং সেগুলোকে প্রিন্ট করা হচ্ছে।

Native SQL এবং Stored Procedure এর সাথে Transactions

যখন আপনি Native SQL অথবা Stored Procedure কল করছেন, তখন transactions ব্যবহারের গুরুত্ব আরও বেড়ে যায়। আপনাকে নিশ্চিত করতে হবে যে, যদি কোয়েরি বা Stored Procedure এ কোনো সমস্যা ঘটে, তাহলে ট্রানজেকশন রোলব্যাক করা হবে।

using (var session = NHibernateHelper.SessionFactory.OpenSession())
{
    using (var transaction = session.BeginTransaction())
    {
        try
        {
            var query = session.CreateSQLQuery("EXEC SomeProcedure");
            query.ExecuteUpdate();  // Execute Stored Procedure

            transaction.Commit();  // Commit the transaction
        }
        catch (Exception)
        {
            transaction.Rollback();  // Rollback if something goes wrong
            throw;
        }
    }
}

এখানে:

  • যদি কোন ভুল হয়, তাহলে transaction.Rollback() ব্যবহার করে পরিবর্তন গুলি রিভার্ট করা হবে।
  • যদি সমস্ত কিছু ঠিক থাকে, তাহলে transaction.Commit() ব্যবহার করে পরিবর্তন সেভ করা হবে।

উপসংহার

Native SQL এবং Stored Procedure ব্যবহার করে আপনি NHibernate এর মাধ্যমে ডেটাবেসের সাথে সরাসরি এবং বেশি কাস্টমাইজড কাজ করতে পারবেন। এটি বিশেষভাবে গুরুত্বপূর্ণ যখন আপনাকে complex SQL কোয়েরি অথবা ডেটাবেসের বিভিন্ন নির্দিষ্ট অপারেশন সম্পাদন করতে হয়।

Content added By
Promotion

Are you sure to start over?

Loading...