PDA

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



fereshte22
شنبه 22 دی 1386, 19:47 عصر
سلام
اگر بخواهیم چندین رکورد را همزمان به دیتابیس اضافه کنیم میتونیم از یه حلق for برای این کار استفاده کنیم.
ولی ایا این روش بهینه ای است.
ایا روش بهتری وجود دارد؟

Behrouz_Rad
شنبه 22 دی 1386, 20:42 عصر
حلقه ی تکرار رو با استفاده از T-SQL بنویسید نه با استفاده از کدهای زبان برنامه نویسی.
داده ها رو با یک Delimiter تفکیک کنید. مثلا # برای تفکیک رکوردها و | برای تفکیک ستون ها.
این مقادیر رو با T-SQL از هم جدا و در دیتابیس ذخیره کنید.

موفق باشید.

majid325
یک شنبه 23 دی 1386, 12:06 عصر
دقیقا منظورتون رو نفهمیدم ولی اگه بگی میخوای چیکار کنی شاید با یه کوئری این کار رو بتونی انجام بدی.

e-shahshahani
یک شنبه 23 دی 1386, 13:31 عصر
اگر چند تا رکورد از طریق یک دستور select به دست میآد میتونیاز دستور insert into ... select ... استفاده کنی.
در sql server 2005 هم یه امکانی هست به اسم batch update یعنی انجام عملیات دسته ای. خیلی هم باحاله.
موفق باشد!

fereshte22
یک شنبه 23 دی 1386, 13:54 عصر
.
در sql server 2005 هم یه امکانی هست به اسم batch update یعنی انجام عملیات دسته ای. خیلی هم باحاله.
موفق باشد!
میشه در این مورد بیشتر توضیح دهید.
مثلا برای insert به صورت دسته ای

fereshte22
دوشنبه 24 دی 1386, 15:40 عصر
ایا روشی که اقای راد فرمودند همین batch update است ؟
اگر نیست میشه یه مثال از batch update را برای نمونه قرار دهید

e-shahshahani
دوشنبه 24 دی 1386, 21:52 عصر
باید 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);
}
}

fereshte22
سه شنبه 25 دی 1386, 13:10 عصر
سلامببینید من در فرم خودم چند ردیف 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;درسته؟

e-shahshahani
چهارشنبه 26 دی 1386, 02:01 صبح
باید بیشتر توضیح می دادم.
شما باید یک 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)
{
//
}
}
}
}

fereshte22
شنبه 29 دی 1386, 22:22 عصر
سلاماز راهنمایتون خیلی ممنون هستم.کد مفید و جالبی بود و خوشبختانه مشکلم را حل کردممنون