انتقال داده‏ ها با استفاده از SqlBulkCopy

SqlBulkCopy

SqlBulkCopy ، در این مقاله ‏میخواهیم در رابطه با نحوه ‏ی انتقال داده ‏ها با استفاده از SqlBulkCopy توضیح دهیم.امیدوارم این مقاله برایتان مفید باشد.

انتقال داده ‏ها از یک منبع به دیگری امری معمول در توسعه ‏ی نرم‏ افزار است.

این عملیات در سناریوهای متفاوت بسیاری ایجاد می‏شود که شامل مهاجرت/انتقال سیستم قدیمی به سیستم جدید، پشتیبان‏گیری از داده‏ ها و جمع ‏آوری داده‏ ها از ناشران مختلف است.

ASP.NET 2.0 حاوی کلاسSqlBulkCopy است که به کپی کردن داده‏ ها از منابع مختلف داده به پایگاه داده‏ ی SQL SERVER کمک می‏کند. در این مقاله، جنبه ‏های مختلف کلاس SqlBulkCopy را شرح خواهم داد.

SqlBulkCopy

 

طراحی پایگاه داده در SqlBulkCopy

طراحی پایگاه داده بسیار ساده است چراکه بر اساس جدول Products (محصولات) در پایگاه داده‏ ی Northwind است.

من سه جدول دیگر در پایگاه داده‏ ی Northwind ایجاد کرده‏ ام.

نمودار پایگاه داده را که در ادامه آمده برای درک بهتر بررسی کنید.

SqlBulkCopy

Products_Archive و Products_Latest شمایی مشابه جدول Products دارند در حالیکه جدول Products_TopSelling متفاوت است.

هدف جدول Products_TopSelling را جلوتر در این مقاله توضیح خواهم داد.

جدول Products_Archive حاوی ۷۷۰۰۰۰ ردیف است.

نیازی نیست نگران این باشید که ردیف ‏ها چگونه در آنجا قرار گرفته ‏اند؛ تنها لازم است در رابطه با نحوه‏ ی انتقال تمام آن ردیف‏ ها به جدول Products_Latest فکر کنید.

انتقال داده‏ ها از Products_Archive به Products_Latest

SqlBulkCopy حاوی یک متد نمونه، WriteToServer، است که جهت انتقال داده‏ ها از منبع به مقصد استفاده می‏شود.

متد WriteToServer می‏تواند اعمال آرایه‏ ی DataRow[]، DataTable و DataReader را انجام دهد.

بسته به موقعیت، می‏توانید نگهدارنده ‏ای که می‏خواهید را انتخاب کنید اما در بیشتر موارد، انتخاب DataReader فکر خوبی است.

به این دلیل که DataReader یک جریان فقط رو به جلو و فقط خواندنی است.

داده‏ ها را نگه نمی‏دارد و از این رو بسیار سریع‏تر از DataTable و DataRows[] است.

کد زیر برای انتقال داده ‏ها از جدول منبع به جدول مقصد استفاده می‏شود.

private static void PerformBulkCopy()
{
    string connectionString =
            @"Server=localhost;Database=Northwind;Trusted_Connection=true";
    // get the source data
    using (SqlConnection sourceConnection = 
            new SqlConnection(connectionString))
    {
        SqlCommand myCommand =
            new SqlCommand("SELECT * FROM Products_Archive", sourceConnection);
        sourceConnection.Open();
        SqlDataReader reader = myCommand.ExecuteReader();

        // open the destination data
        using (SqlConnection destinationConnection =
                    new SqlConnection(connectionString))
        {
            // open the connection
            destinationConnection.Open();

            using (SqlBulkCopy bulkCopy =
            new SqlBulkCopy(destinationConnection.ConnectionString))
            {
                bulkCopy.BatchSize = 500;
                bulkCopy.NotifyAfter = 1000;
                bulkCopy.SqlRowsCopied +=
                    new SqlRowsCopiedEventHandler(bulkCopy_SqlRowsCopied);
                bulkCopy.DestinationTableName = "Products_Latest";
                bulkCopy.WriteToServer(reader);
            }
        }
        reader.Close();
    }
}

باید به چند نکته در اینجا اشاره کرد.

اول اینکه من از DataReader برای واکشی ردیف‏ ها از جدول پایگاه داده استفاده می‏کنم.

شیء “bulkCopy” کلاس SqlBulkCopy ویژگی DestinationTableName را بر روی جدول مقصد تنظیم می‏کند، که در این مورد “Products_Latest” است.

Products_Latest جدول مقصد است از آنجایی که داده ‏ها از جدول Products_Archive به جدول Products_Latest منتقل می‏شود.

شیء bulkCopy همچنین رویداد SqlRowsCopied را که پس از اینکه ردیف ‏هایی که توسط NotifyAfterProperty شناسایی شده بودند مورد دستیابی قرار گرفتند از بین می‏رود را آشکار می‏کند.

این بدین معناست که رویداد پس از هر ۱۰۰۰ ردیف از بین می‏رود چراکه NotifyAfter بر روی ۱۰۰۰ تنظیم شده است.

ویژگی BatchSize بسیار مهم است چراکه بیشتر عملکرد به آن بستگی دارد.

BatchSize به معنی این است که چند ردیف در یک زمان به پایگاه داده برای شروع انتقال داده ‏ها ارسال خواهد شد.

من BatchSize را بر روی ۵۰۰ تنظیم کرده‏ ام که یعنی هنگامیکه خواننده ۵۰۰ ردیف را خواند برای اجرای عملیات bulk copy به پایگاه داده فرستاده خواهد شد.

بطور پیش فرض BatchSize مقدار “۱” را دارد که بدین معناست که هر ردیف به عنوان یک تک دسته به پایگاه داده فرستاده می‏شود.

BatchSizeهای مختلف نتایج متفاوتی به شما خواهند داد.

باید امتحان کنید که کدام batch size مناسب نیازهای شماست.

انتقال داده‏ ها بین جداولی از نگاشت ‏های مختلف

در مثال بالا، هر دو جدول شمای یکسانی داشتند.

برخی مواقع، نیاز دارید داده ‏ها را بین جداولی که شمای متفاوتی دارند جابجا کنید.

فرض کنید می‏خواهید تمام نام و مقدار محصولات را از Products_Archive به جدول Products_TopSelling انتقال دهید.

شما (الگو) در دو جدول متفاوت است چراکه نام ستون‏ های متفاوتی دارند.

این مورد همچنین در تصویر بالا، در زیر بخش طراحی پایگاه داده، قابل رؤیت است.

private static void PerformBulkCopyDifferentSchema()
{
    string connectionString = @"Server=
        localhost;Database=Northwind;Trusted_Connection=true";
    DataTable sourceData = new DataTable();
    // get the source data
    using (SqlConnection sourceConnection =
                    new SqlConnection(connectionString))
    {
        SqlCommand myCommand =
            new SqlCommand("SELECT TOP 5 * 
            FROM Products_Archive", sourceConnection);
        sourceConnection.Open();
        SqlDataReader reader = myCommand.ExecuteReader();
        // open the destination data
        using (SqlConnection destinationConnection =
                    new SqlConnection(connectionString))
        {
            // open the connection
            destinationConnection.Open();
            using (SqlBulkCopy bulkCopy =
                new SqlBulkCopy(destinationConnection.ConnectionString))
            {
                bulkCopy.ColumnMappings.Add("ProductID", "ProductID");
                bulkCopy.ColumnMappings.Add("ProductName", "Name");
                bulkCopy.ColumnMappings.Add("QuantityPerUnit", "Quantity");
                bulkCopy.DestinationTableName = "Products_TopSelling";
                bulkCopy.WriteToServer(reader);
            }
        }
        reader.Close();
    }
}

مجموعه ‏ی ColumnMappings برای نگاشت ستون بین جدول منبع و جدول مقصد بکار می‏رود.

انتقال داده ‏ها از فایل XML به جدول پایگاه داده

منبع داده‏ ها تنها به جداول پایگاه داده محدود نمی‏شود، بلکه می‏توانید از فایل‏های XML نیز استفاده کنید.

در اینجا یک فایل XML بسیار ساده آورده شده که به عنوان منبعی برای عملیات bulk copy استفاده می‏شود. (Products.xml)

<?xml version="1.0" encoding="utf-8" ?>

<Products>
  <Product productID="1" productName="Chai" />
  <Product productID="2" productName="Football" />
  <Product productID="3" productName="Soap" />
  <Product productID="4" productName="Green Tea" />
</Products>
private static void PerformBulkCopyXMLDataSource()
{
    string connectionString =
            @"Server=localhost;Database=Northwind;Trusted_Connection=true";
    DataSet ds = new DataSet();
    DataTable sourceData = new DataTable();
    ds.ReadXml(@"C:\Products.xml");
    sourceData = ds.Tables[0];
    // open the destination data
    using (SqlConnection destinationConnection =
                    new SqlConnection(connectionString))
    {
        // open the connection
        destinationConnection.Open();
        using (SqlBulkCopy bulkCopy =
                    new SqlBulkCopy(destinationConnection.ConnectionString))
        {
            // column mappings
            bulkCopy.ColumnMappings.Add("productID", "ProductID");
            bulkCopy.ColumnMappings.Add("productName", "Name");
            bulkCopy.DestinationTableName = "Products_TopSelling";
            bulkCopy.WriteToServer(sourceData);
        }
    }
}

فایل ابتدا در DataTable خوانده می‏شود و سپس به متد WriteToServer از کلاس SqlBulkCopy داده می‏شود.

از آنجاییکه جدول مقصد Products_TopSelling است، باید نگاشت ستون را اجرا کنیم.

نتیجه گیری

در یان مقاله، نحوه‏ ی استفاده از کلاس SqlBulkCopy را که در .NET 2.0 معرفی شده را نمایش دادم.

کلاس SqlBulkCopy انتقال داده‏ ها از یک منبع به پایگاه داده‏ ی SQL SERVER را آسان‏ تر می‎کند.

امیدوارم از این مقاله لذت برده باشید، کدنویسی خوش بگذرد!


زهره سلطانیان

نوشته‌های مرتبط

دیدگاه‌ها

*
*

این سایت از اکیسمت برای کاهش هرزنامه استفاده می کند. بیاموزید که چگونه اطلاعات دیدگاه های شما پردازش می‌شوند.