PDA

View Full Version : تراکنش با دستورات insertمتغیر



Bahar_HS
شنبه 08 آبان 1389, 08:30 صبح
با سلام
می خوام 3 دستور insertباهم انجام بشه،
اولین دستور insertیکی است ودر جدول اول اضافه می شود(ثابت است)،
سومین دستور insertهم یکی است و به جدول سوم اضافه می شود،

ولی insertهای جدول دوم متغیر است،چطور میشه این کاررو کرد؟

برای ارتباط با دیتابیس کلاس نوشتم و برای هر 3 insert هم 3تابع جداگانه نوشتم،اگه قرار باشه هر 3 با هم انجام بشن در یک تراکنش، باید همه رو به یک تابع فرستاد؟چطوری میشه؟ :متفکر:

حمیدرضاصادقیان
شنبه 08 آبان 1389, 08:38 صبح
سلام. شما اگر میخواهید هر سه insert در یک زمان انجام شوند و اگر یکی انجام نشد مابقی نیز انجام نشوند بهتره درون یک Stored procedure این سه insert رو نوشته و بین بلاک Begin tran ,commit tran قرار بدید و کنترل کنید اگر خطایی رخ داد با استفاده از Rollback tran رکوردهای اضافه شده رو برگردونید.

بعد منظورتون از insert از نوع متغیر چیه؟ لطفا یک مثال بزنید.

Bahar_HS
شنبه 08 آبان 1389, 08:59 صبح
این فرمه خریده،
اولینinsert مشخصات ثابت خرید رو به نام مشتری ثبت می کنه،مثلادر چه تاریخی،باکدوم شماره ی فاکتور،باکدوم شماره بار ،از کدوم شهر و.......

سومین insertهم نام مشتری رو در لیست کسانی قرار می ده که باید بهشون پولی پرداخت بشه،که این هم یه insert میشه،

و در جدول دوم به ازای هر سطر فاکتور(به ازای هر باری که آورده)باید به جدول دوم insertبشه،
نمیدونم چطور به صورت متغیر پارامترها رو به بفرستم،
برای ارسال سطرهای فاکتور در برنامه یه حلقه ی گذاشتم که به همین تعداد insertانجام میشه ،
بقیه ش رو نمی دونم باید چکار کنم؟

حمیدرضاصادقیان
شنبه 08 آبان 1389, 09:04 صبح
سلام.شما پارامترهای متغیر نداری. شما مقادیر متغیر داری. که با استفاده از همون روش حلقه شما یک sp مینویسی بعد به پارامترها مقدار پاس میدی. هربار هم میتونه این مقدار تغییر کنه.روش کارش هم مثل همون دو insert قبلی خودتون هست. البته روشهای دیگه ای هم هست. مثل ارسال آرایه به Sp که شما میتونید ابتدا تمام مقادیر فاکتور رو در یک آرایه ذخیره کنید و سپس اونو به sp ارسال کنید . که نیازی نباشه فرضا برای یک فاکتور 1000 ردیفی یک حلقه 1000 تایی رو تکرار کنید.
موفق باشید

Bahar_HS
شنبه 08 آبان 1389, 14:15 عصر
ممنون از راهنمایی تون،
من هنور اشکال دارم،
در کد نویسی سی شارپ این طور می نوشتم:




public int InserttoShopping(string[] values)
{
SqlConnection dbcon = new SqlConnection(@"Data Source=" + System.Environment.MachineName + "\\" + GetSqlServerName() + ";Initial Catalog=Bongah;Integrated Security=true");
SqlCommand query = new SqlCommand();
query.Connection = dbcon;
string command="INSERT INTO Shopping VALUES(";
query.CommandText ="SPName";
query.Parameters.Clear();
ClassDate Date = new ClassDate();
DateTime dt = Date.Shamsi2Miladi(values[0]);
query.Parameters.AddWithValue("@date", dt);
query.Parameters.AddWithValue("@nfactor", values[1]);
query.Parameters.AddWithValue("@typeshopping", values[2]);
query.Parameters.AddWithValue("@id", values[3]);
query.Parameters.AddWithValue("@ncar", values[4]);
query.Parameters.AddWithValue("@makhareg", Convert.ToInt32(values[5]));
query.Parameters.AddWithValue("@weghtAll", Convert.ToDouble(values[6]));
query.Parameters.AddWithValue("@typesalling", values[7]);
query.Parameters.AddWithValue("@city", values[8]);
query.Parameters.AddWithValue("@priceAll", Convert.ToInt32(values[9]));
//
try
{
dbcon.Open();
}
catch
{
return -1;
}
//
try
{
query.ExecuteNonQuery();
}

catch
{
return -2;
}
//
dbcon.Close();
return 1;
}


برای هم این طور می نویسم:




CREATE PROCEDURE SPName
AS ( list parameters)
INSERT INTO Shopping1
VALUES( @date,@nfactor,@typeshopping,@id,@ncar,@makhareg)

تعدادی دستور INSERT که تعدادش مشخص نیست
INSERT INTO Shopping2 VALUES( @weghtAll,@typesalling,@city,@priceAll
)

چطوری بهSP بگم به تعداد متغیری اجرا شه؟
یا این که اصلا ازSP استفاده نکنم ودستورات INSERT رو در بخش کدنویسی بنویسم؟

behrouzlo
شنبه 08 آبان 1389, 14:36 عصر
می توانید برای هر قسمت یک Sp جداگانه بنویسید. و از داخل برنامه قسمت دوم را داخل حلقه For قرار دهید و SP را فراخوانی کنید. برای کنترل تراکنش در داخل برنامه خود می توانید از فضای نام System.Transactions و کلاسهای در داخل آن مانند TransactionScope استفاده کنید.

m_omrani
شنبه 08 آبان 1389, 18:19 عصر
در این مقاله انواع و اقسام روش های ارسال آرایه و لیستی از مقادیر به SQL Server توضیح داده شده:

http://www.sommarskog.se/arrays-in-sql-2005.html

همچنین نیازی نیست شما در کُد C# تون از تراکنش استفاده کنید (و فضای نام System.Transactions رو به کُدتون اضافه کنید). تراکنش رو باید به زبان T-SQL (با استفاده از begin tran و commit tran یا rollback tran) داخل همون sp که سه تا insert رو انجام می ده ایجاد کنید نه داخل کُد C#.

بر خلاف چیزی که آقای بهروزلو می گن، خورد کردن منطق عملیات به چندین sp جدا از هم و فراخوانی sp داخل یک حلقه، روش خوبی نیست.

می تونین همه عملیات رو در یک sp انجام بدین.