PDA

View Full Version : گفتگو: درج همزمان چند رکورد در sql از c#



rezayeman
شنبه 29 شهریور 1393, 10:42 صبح
با سلام خدمت دوستان عزیزم

می خواستم یه راهنمایی از شما بگیرم

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

اندازه کارتونها هم متفاوته مثلا 20 تایی، 30 تایی و ....

این کار به خاطر این انجام میشه که معلوم بشه تو هر کارتون چه محصولاتی قرار گرفته

حالا سوالم اینه چطوری محصولاتو توی جدول کارتون توی بانک ذخیره کنم که هم مطمئن بشم مثلا عین 20 محصول با موفقیت ذخیره شده

آیا کار درستیه به ازای هر محصول به بانک وصل بشم؟ این در حالیه که ممکنه توی دقیقه بالای 200 محصول توسط چندین اپراتور ثبت بشه

danialafshari
شنبه 29 شهریور 1393, 11:37 صبح
با سلام
برای این کار شما به دو جدول نیاز دارید
یک جدول Primary که اطلاعات کلی رو میگیره مانند کارتون،تعداد بسته، تاریخ سند و...
یک جدول هم برای اقلام کارتون که بوسیله کلید خارجی به Primary ریلی شن شده
اقلام رو در دیتاگرید add می کنید برای کنترل تعداد هم می تونید از تعداد بسته جدول Primary استفاده کنید
مثلا اگر 20 تایی بود بیشتر 20 قلم نمیگیره
در نهایت همه ی اقلام رو توسط حلقه در بانک ذخیره می کنید
موفق باشید

rezayeman
شنبه 29 شهریور 1393, 12:50 عصر
مرسی از جوابت

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

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

danialafshari
شنبه 29 شهریور 1393, 13:21 عصر
1- خب اگه برق رفت کاریش نمیشه کرد، وقتی برق اومد مجدداً اقلام کارتون رو ذخیره کنید
2-ID - int

Davidd
شنبه 29 شهریور 1393, 13:35 عصر
اگه هدف شما اينه كه هر 20 ركورد باهم درج بشه يا هيچ كدوم درج نشه، بايد از Transaction استفاده كنيد. كوئري هاي Insert به هم الحاق كنيد. اگه وسط كار برق بره يا هر خطايي رخ بده درج انجام نميشه.
براي نوع فيلد هم int تا 2 ميليارد عدد مثبت ميتونه و اگه كافي نيست از bigint استفاده كنيد
يك مثال از تراكنش:
string complexCommand = string.Concat(
"DECLARE @first_table AS TABLE(col1 int IDENTITY, col_x varchar(20), col_y varchar(20))"
, " DECLARE @second_table AS TABLE(col2 int IDENTITY, col_z varchar(20), col_a varchar(20))"
, " DECLARE @third_table AS TABLE(col3 int IDENTITY, col_b varchar(20), col_c varchar(20))"
, " DECLARE @my_table AS TABLE(col1 int, col2 int, col3 int, col_v varchar(20))"
, " DECLARE @col1 int"
, " DECLARE @col2 int"
, " DECLARE @col3 int"
, " BEGIN TRAN"
, " BEGIN TRY"
, " insert into @first_table (col_x, col_y) values ('col_x', 'col_y')"
, " SET @col1=@@IDENTITY"
, " insert into @second_table (col_z, col_a) values ('col_z', 'col_a')"
, " SET @col2=@@IDENTITY"
, " insert into @third_table (col_b, col_c) values ('col_b', 'col_c')"
, " SET @col3=@@IDENTITY"
, " insert into @my_table(col1, col2, col3, col_v) values (@col1, @col2, @col3, 'col_v')"
, " COMMIT"
, " END TRY"
, " BEGIN CATCH"
, " ROLLBACK"
, " END CATCH");

rezayeman
شنبه 29 شهریور 1393, 13:39 عصر
ممنونم دقیقا چیزیه که میخواستم

اما در مورد int بعید میدونم جوابگو باشه. مگر اینکه بیام دیتا بیس هر سالو از سالهای دیگه جدا کنم