نمایش نتایج 1 تا 10 از 10

نام تاپیک: اضافه کردن چندین رکورد به طور همزمان به دیتابیس

  1. #1

    Tick اضافه کردن چندین رکورد به طور همزمان به دیتابیس

    سلام
    اگر بخواهیم چندین رکورد را همزمان به دیتابیس اضافه کنیم میتونیم از یه حلق for برای این کار استفاده کنیم.
    ولی ایا این روش بهینه ای است.
    ایا روش بهتری وجود دارد؟

  2. #2
    حلقه ی تکرار رو با استفاده از T-SQL بنویسید نه با استفاده از کدهای زبان برنامه نویسی.
    داده ها رو با یک Delimiter تفکیک کنید. مثلا # برای تفکیک رکوردها و | برای تفکیک ستون ها.
    این مقادیر رو با T-SQL از هم جدا و در دیتابیس ذخیره کنید.

    موفق باشید.

  3. #3
    VIP
    تاریخ عضویت
    اردیبهشت 1403
    محل زندگی
    www
    سن
    40
    پست
    1,247
    دقیقا منظورتون رو نفهمیدم ولی اگه بگی میخوای چیکار کنی شاید با یه کوئری این کار رو بتونی انجام بدی.

  4. #4
    کاربر دائمی آواتار e-shahshahani
    تاریخ عضویت
    مرداد 1384
    محل زندگی
    تهران
    پست
    229
    اگر چند تا رکورد از طریق یک دستور select به دست میآد میتونیاز دستور insert into ... select ... استفاده کنی.
    در sql server 2005 هم یه امکانی هست به اسم batch update یعنی انجام عملیات دسته ای. خیلی هم باحاله.
    موفق باشد!

  5. #5
    نقل قول نوشته شده توسط e-shahshahani مشاهده تاپیک
    .
    در sql server 2005 هم یه امکانی هست به اسم batch update یعنی انجام عملیات دسته ای. خیلی هم باحاله.
    موفق باشد!
    میشه در این مورد بیشتر توضیح دهید.
    مثلا برای insert به صورت دسته ای

  6. #6
    ایا روشی که اقای راد فرمودند همین batch update است ؟
    اگر نیست میشه یه مثال از batch update را برای نمونه قرار دهید

  7. #7
    کاربر دائمی آواتار e-shahshahani
    تاریخ عضویت
    مرداد 1384
    محل زندگی
    تهران
    پست
    229
    باید sql server 2005 داشته باشید!
    شاید روش زیر به کارتان نیاید. اگر بیشتر توضیح بدهید بهتر است.

    در این روش، شما در C#‎.net یا vb.net یک datatable می سازید. مثلا از طریق یک توسط دستور select. بنابرایناین datatable می تواند شامل چند رکورد باشد.
    سپس می توانید داده های موجود در این datatable را ویرایش کنید، رکورد اضافه و حذف کنید و سپس با یک دستور بروز رسانی، همه تغییرات را با هم تعمال کنید.
    توجه کنید که یک stored procedure برای اعمال رکورد های اضاه شده و یکی هم برای رکورد های حذف شده و یکی هم برای رکورد های ویرایش شد باید تعیین کنید.

    مثال را در msdn هم می توانید پیدا کنید! کمی جستجو کنید!

    مثال :



    public static void BatchUpdate(DataTable dataTable,Int32 batchSize)
    {
    // Assumes GetConnectionString() returns a valid connection string.
    string connectionString = GetConnectionString();

    // Connect to the AdventureWorks database.
    using (SqlConnection connection = new
    SqlConnection(connectionString))
    {

    // Create a SqlDataAdapter.
    SqlDataAdapter adapter = new SqlDataAdapter();

    // Set the UPDATE command and parameters.
    adapter.UpdateCommand = new SqlCommand(
    "UPDATE Production.ProductCategory SET "
    + "Name=@Name WHERE ProductCategoryID=@ProdCatID;",
    connection);
    adapter.UpdateCommand.Parameters.Add("@Name",
    SqlDbType.NVarChar, 50, "Name");
    adapter.UpdateCommand.Parameters.Add("@ProdCatID",
    SqlDbType.Int, 4, "ProductCategoryID");
    adapter.UpdateCommand.UpdatedRowSource = UpdateRowSource.None;

    // Set the INSERT command and parameter.
    adapter.InsertCommand = new SqlCommand(
    "INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",
    connection);
    adapter.InsertCommand.Parameters.Add("@Name",
    SqlDbType.NVarChar, 50, "Name");
    adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;

    // Set the DELETE command and parameter.
    adapter.DeleteCommand = new SqlCommand(
    "DELETE FROM Production.ProductCategory "
    + "WHERE ProductCategoryID=@ProdCatID;", connection);
    adapter.DeleteCommand.Parameters.Add("@ProdCatID",
    SqlDbType.Int, 4, "ProductCategoryID");
    adapter.DeleteCommand.UpdatedRowSource = UpdateRowSource.None;

    // Set the batch size.
    adapter.UpdateBatchSize = batchSize;

    // Execute the update.
    adapter.Update(dataTable);
    }
    }

  8. #8
    سلامببینید من در فرم خودم چند ردیف textbox دارم .مثلا 5 ردیف.که هر ردیف شامل یک رکورد میباشد.حالا کاربر ممکنه هر تعداد از این ردیف ها را پر کند و همزمان چند رکورد به دیتابیس اضافه کند.آقای راد فرمودند که از # برای جدا کردن رکوردها استفاده کنم ولی من در sp ای که نوشتم از # خطا میگیرفت و نتونستم ازش استفاده کنم .میشه راهنمایی کنید که باید از این جدا کننده ها استفاده کنم؟در مورد روش دوستمون e-shahshahani کد زیر به نظر فقط یک رکورد اضافه میکند.
     adapter.InsertCommand = new SqlCommand(            "INSERT INTO Production.ProductCategory (Name) VALUES (@Name);",             connection);        adapter.InsertCommand.Parameters.Add("@Name",           SqlDbType.NVarChar, 50, "Name");        adapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
    درسته؟

  9. #9
    کاربر دائمی آواتار e-shahshahani
    تاریخ عضویت
    مرداد 1384
    محل زندگی
    تهران
    پست
    229
    باید بیشتر توضیح می دادم.
    شما باید یک DataTable بسازید. ستون های مورد نیاز را به آن اضافه کنید.
    سپس به اضای هر رکورد که می خواهید یک سطر (DataRow) به DataTable اضافه کنید.
    مطمئن باش کار می کنه!
    موفق باشید.

    DataTable dtTest = new DataTable();
    dtTest.Columns.Add("UserId", typeof(SqlGuid));
    dtTest.Columns.Add("Price", typeof(Int16));

    int j = 0;
    for (int i = 0; i < recs.Count; i++)
    {
    DataRow drTest = dtTest.NewRow();
    drTest["UserId"] = new SqlGuid(currentUser.Identifier);
    drTest["Price"] = price ;
    dtTest.Rows.Add(drTest);
    }

    using (SqlConnection cnx = new SqlConnection(cs))
    {
    cnx.Open();
    using (SqlTransaction tran = cnx.BeginTransaction())
    {
    try
    {
    using (SqlCommand cmdOrders = new SqlCommand("sp_Test", cnx, tran))
    {
    cmdOrders.CommandType = CommandType.StoredProcedure;
    cmdOrders.Parameters.Add("@UserId", SqlDbType.UniqueIdentifier, 16, "UserId");
    cmdOrders.Parameters.Add("@Price", SqlDbType.SmallInt, 2, "Price");

    SqlDataAdapter detailsAdapter = new SqlDataAdapter();
    detailsAdapter.InsertCommand = cmdOrders;
    detailsAdapter.InsertCommand.UpdatedRowSource = UpdateRowSource.None;
    detailsAdapter.UpdateBatchSize = 0;
    detailsAdapter.Update(dtTest);
    }
    tran.Commit();

    }
    catch (Exception ex)
    {
    try
    {
    tran.Rollback();
    }
    catch (Exception ex2)
    {
    //
    }
    }
    }
    }

  10. #10
    سلاماز راهنمایتون خیلی ممنون هستم.کد مفید و جالبی بود و خوشبختانه مشکلم را حل کردممنون

قوانین ایجاد تاپیک در تالار

  • شما نمی توانید تاپیک جدید ایجاد کنید
  • شما نمی توانید به تاپیک ها پاسخ دهید
  • شما نمی توانید ضمیمه ارسال کنید
  • شما نمی توانید پاسخ هایتان را ویرایش کنید
  •