Dapper چیست؟ Dapper یک ORM  کوچک و بسیار سریع است که توسط سایت Stackoverflow توسعه داده شده است. Dapper با هر نوع دیتابیسی کار میکند و مختص به یک دیتابیس خاص نیست. با استفاده از Dapper شما میتوانید دستورات SQL را به صورت Stored Procedure و یا به صورت دستورات مستقیم SQL اجرا کنید. اگر در پروژه ای مجبور شوید Stored Procedure بنویسید یا از دستورات مستقیم SQL استفاده کنید به جای استفاده از ORM هایی مانند EF و NHibernate و ... Dapper بهترین گزینه برای شماست. استفاده از Dapper بسیار ساده است شما میتوانید کوئری های SQL را بنویسید و نتایج را درون کلاس های #C نگه دارید. برای استفاده از Dapper ابتدا باید از طریق package console manager دستور زیر را وارد کنید.

Install-Package Dapper

در ادامه میخواهیم یک رکورد جدید به دیتابیس اضافه کنیم با استفاده از Dapper 

class Program
{
    public static async Task Main(string[] args)
    {
        var connectionString = "Data Source=.;Initial Catalog=Dapper;Integrated Security=True";
        using (SqlConnection connection = new SqlConnection(connectionString))
        {
            DynamicParameters parameters = new DynamicParameters();
            parameters.Add("Name", "Farhad", DbType.String);
            parameters.Add("Family", "Zamani", DbType.String);
            parameters.Add("Age", 21, DbType.Int32);
            var affectedRows = await connection.ExecuteAsync("INSERT INTO USERS (Name,Family,Age) Values(@Name,@Family,@Age)", parameters);
            Console.WriteLine(affectedRows);
            Console.ReadLine();
        }
    }
}

در کد بالا با استفاده از DynamicParameters پارامترهای مورد نیاز را برای افزودن رکورد جدید به جدول کاربران مشخص کرده ایم. با این کار هم نوع داده هارا مشخص کرده ایم به عنوان مثال برای فیلد Age از Int32 استفاده کرده ایم و از SQL Injection نیز جلوگیری کرده ایم. و در نهایت با استفاده از اکستنشن متد ExecuteAsync  که در کتابخانه Dapper نوشته شده است کوئری را به دیتابیس ارسال کرده ایم و اگر کد زیر را اجرا کنیم مقدار 1 برگردانده میشود و در متغییر affectedRows ذخیره میشود این بدان معناست که یک رکورد به جدول Users اضافه شده است. در ادامه میخواهیم  لیست کاربران را از دیتابیس با استفاده از Dapper بخوانیم. ابتدا یک مدل برای ذخیره کاربران ایجاد میکنیم که پراپرتی های آن برابر باشد با ستون های جدول کاربران :

public class Users
{
    public int Id { get; set; }
    public string Name { get; set; }
    public string Family { get; set; }
    public int Age { get; set; }
}

و در ادامه لیست کاربران را با استفاده از Dapper میخوانیم و در لیستی از نوع مدل کاربران ذخیره میکنیم.

public static async Task Main(string[] args)
{
    var connectionString = "Data Source=.;Initial Catalog=Dapper;Integrated Security=True";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        IEnumerable<Users> users = (await connection.QueryAsync<Users>("SELECT * FROM Users")).AsEnumerable();
        foreach (var user in users)
        {
            Console.WriteLine(user.Name + "\t" + user.Family + "\t" + user.Age);
        }
        Console.ReadLine();
    }
}

تنها تفاوت کد خواندن اطلاعات با افزودن اطلاعات در کوئری و متد استفاده شده بود که در خواندن اطلاعات بجای ExecuteAsync  از QueryAsync استفاده کردیم چون در کد بالا یک کوئری به دیتابیس ارسال کردیم و یک سری اطلاعات از دیتابیس دریافت کردیم ( Query ) اما در افزودن کاربر یک رکورد به دیتابیس اضافه کردیم و این کار یک Execute Command به حساب می آید ( Command ). در نهایت اگر کد بالا را اجرا کنید خروجی زیر را دریافت خواهید کرد.

Farhad  Zamani  21

اگر بخواهیم فقط تعداد کاربران را بدست بیاوریم میتوانیم به صورت زیر عمل کنیم :

public static async Task Main(string[] args)
{
    var connectionString = "Data Source=.;Initial Catalog=Dapper;Integrated Security=True";
    using (SqlConnection connection = new SqlConnection(connectionString))
    {
        int userCount = await connection.QueryFirstAsync<int>("SELECT COUNT(1) FROM Users");
        Console.WriteLine(userCount);
        Console.ReadLine();
    }
}

اگر از QueryFirstAsync استفاده کنید اولین رکورد دریافت شده از دیتابیس را به شما برمیگرداند و اگر کوئری بالا را در SQL اجرا کنید فقط یک رکورد را برای شما بر میگرداند و مقدار آن تعداد کاربران موجود در جدول Users میباشد. با استفاده از QueryFirstAsync که یک نوع جنریک قبول میکند میتوانید نوع خروجی را مشخص کنید. به عنوان مثال در کد بالا با قرار دادن نوع int در متد QueryFirstAsync مشخص کرده ایم که مقدار بازگشتی باید از نوع int باشد.

Powered by Froala Editor