PDA

View Full Version : سوال: ارسال حلقه ای پارامترها به SP



shgroup
چهارشنبه 22 دی 1389, 11:12 صبح
سلام دوستان
من تو یک برنامه Win app به یک مشکلی برخورد کردم که به این شکله:
در برنامه فرمی نمایش داده میشه که جدولی از مقادیر را کاربر وارد میکند که باید در sql ذخیره شود اما مشکل اینجاست که اطلاعات باید به صورت سطری ذخیره شوند نه ستونی منظورم اینه که هر پارامتر در یک ستون از جدول قرار نمی گیره

مثال :
سال- تیپ - کد بخش - کد زیر بخش - مبلغ

این مقادیر تشکیل یک سطر اطلاعاتی را میدهند و به همین صورت اطلاعات سطر بعد با همین ستون ها
حال سوالم این است که من پارامترها را در برنامه در یک حلقه قرار دهم و به SP ارسال کنم و SP هر کدام را سطر به سطر ذخیره کند یا اینکه این حلقه را در SP اینجاد کنم که فکر کنم راه درستی نباشه ؟

سپاس

حمیدرضاصادقیان
چهارشنبه 22 دی 1389, 13:13 عصر
سلام.

اطلاعات باید به صورت سطری ذخیره شوند نه ستونی

شما وقتی از دستور Insert استفاده میکنید یک ردیف ایجاد میکنه نه یک ستون!!
همچنین وقتی به پارامترها مقدار پاس بدید و در Insert همون مقادیر رو استفاده کنید مشکلتون حله.
من متوجه نشدم دقیقا ایراد کار شما کجاست!!

shgroup
پنج شنبه 23 دی 1389, 00:51 صبح
سلام.
شما وقتی از دستور Insert استفاده میکنید یک ردیف ایجاد میکنه نه یک ستون!!
همچنین وقتی به پارامترها مقدار پاس بدید و در Insert همون مقادیر رو استفاده کنید مشکلتون حله.
من متوجه نشدم دقیقا ایراد کار شما کجاست!!

بله دوست عزیز می دونم که در دستور Insert یک ردیف اطلاعاتی ذخیره میشه (منظور منم از سطر همینه)
یک مثال می زنم تا بهتر موضوع روشن بشه
فرض کنید در یک فروشگاه می خواهید نرخ اجناسی را توسط یک جدول نرخنامه وارد بانک کنید
در صورتی که به قول خودم ستونی طراحی کنیم این شکلی میشه جدول ما:

اسم ستونهای جدول: کد - سال - قیمت اتو - قیمت جارویرقی - قیمت چرخ خیاطی و...
مقادیر وارد شده: 1 - 1388 - 20000 - 250000 - 165000 و ...

که می دونم این نوع طراحی کاملا اشتباه است حال فرض کنید این شکلی طراحی کرده باشیم

اسم ستونهای جدول: کد - سال - کد محصول - مبلغ
مقادیر وارد شده: 1 - 1388 - 14 - 250000
در روش دوم که من هم همین کار رو کردم فرض کنید تعداد اجناس مثلا 10 تا بیشتر نیست و ثابت است حال در فرمی ما می خواهیم یک جا همه اجناس را قیمت گذاری کنیم و
با فشردن دکمه ثبت مقادیر هر کالا در هر ردیف جدا مثل مثال فوق ذخیره گردند - همین
حال باید این ارسال مقادیر را در یک حلقه با 10 بار تکرار عمل Insert انجام دهیم یا خیر این حلقه را در SP قرار دهیم.
شاید سوال من خیلی مبتدی است اما سواله دیگه :D
مممنونم

حمیدرضاصادقیان
پنج شنبه 23 دی 1389, 08:41 صبح
سلام.
اگر از نسخه 2000 به بالا استفاده میکنید میتوانید از دستور Insert into به این شکل استفاده کنید.


Insert into Table1 (Code,Year,Code_Product,Price)
Values (1,1388,14,25000),
(2,1388,20,250004),
(3,1389,10,450000),
.
.
.

Reza_Yarahmadi
پنج شنبه 23 دی 1389, 10:40 صبح
شما برنامه رو باید طوری طراحی کنید که در هر حالتی کار کنه ، با فرضیات و قانونهایی که فعلا ثابت هستند و بعدا ممکنه تغییر کنه نمیشه کار کرد. اگر کاربر اقلام اجناسش 100 تا شد چی؟ اگر 1000 تا شد چطور؟
نمیتونید همه این مقادیر رو یکجا به SP بفرستید. مطمئن ترین کار اینه که SP هربار فقط یک سطر رو ذخیره کنه و توی برنامه و با استفاده از یک حلقه هر بار اطلاعات یکی از سطرها رو به SP پاس بدید. توی این حالت اگر کاربر هرچندتا سطر وارد کنه بدون مشکل ذخیره میشه و دردسر اضافی هم نمیکشید.

shgroup
پنج شنبه 23 دی 1389, 11:17 صبح
سلام
مرسی از پاسخ دوستان

جناب صادقیان عزیز راهی که گفتید رو اطلاع دارم اما چه طوری باید به این شکل مقادیر رو در سطر های بعدی پاس داد ؟
جناب Yarahmadi عزیز درست می فرمایید شما اما یه سوال دیگه اینه که آیا 10 با اجرا کردن دستور Insert به طور یکجا کاری درست است و از نظر سرعت چطور ؟

پیشنهاد دیگری دوستان ندارند ؟
باز هم سپاس فراوان

Reza_Yarahmadi
پنج شنبه 23 دی 1389, 15:17 عصر
آیا 10 با اجرا کردن دستور Insert به طور یکجا کاری درست است و از نظر سرعت چطور ؟
تقریبا میشه گفت از نظر زمانی فرقی بین 10 بار عمل Insert انجام شدن با یکجا ذخیره کردن 10 رکورد وجود نداره ، ولی از نظر پیاده سازی خیلی با هم فرق دارند ، در حالت یکجا شما مجبور به پیاده سازی پیچیده تر و طولانی تر هم سمت برنامه و هم سمت SQL Server هستید.
10 یا حتی 100 عمل Insert چندان سربار زمانی نداره که بخواید نگران زمان اون باشید ، توی برنامه به علت سرعت بالای سیستم های امروزی فرقی بین 1 Insert با 100 Insert احساس نمیکنید(البته در حالتی داده ها دارای اندازه معمولی باشند)

حمیدرضاصادقیان
پنج شنبه 23 دی 1389, 21:24 عصر
سلام.
من با جناب یار احمدی موافقم و حرف ایشون درسته. شما بهتره ساختار جداولتون رو اصلاح کنید وگرنه به این شکل کار کردن شمارو به دردسرخواهد انداخت.
شما میتونید به صورت عادی و به همون شکلی که جناب یاراحمدی گفتند جدول رو طراحی کنید و اگر میخواهید به شکلی که خودتون مثال زدید کوئری بگیرید میتونید از Pivot استفاده کنید.

mehdi.mousavi
پنج شنبه 23 دی 1389, 23:15 عصر
تقریبا میشه گفت از نظر زمانی فرقی بین 10 بار عمل Insert انجام شدن با یکجا ذخیره کردن 10 رکورد وجود نداره

سلام.
البته که تفاوت دارن، اما خوب، این تفاوت در تعداد بالای رکوردها محسوس هستش. Insert کردن گروهی رکوردها با یک دستور و در یک Transaction، سریعتر از درج همون تعداد رکورد در Transaction های جداگانه هستش. بخصوص اگر Round-Trip های بین Client و Server رو نیز در نظر بگیریم، تفاوت سرعت چشمگیرتر خواهد بود.

@shgroup: اگر اصرار به درج اطلاعات در یک بار فراخوانی SP دارید، میتونید داده ها رو بصورت XML به SP پاس کنید، سپس در Stored Procedure خودتون با یک SELECT (عموما) ساده، داده ها رو بصورت یکجا در بانک ذخیره کنید. قبلا فکر میکنم در این مورد در تاپیک دیگه ای توضیح داده ام، لطفا برای اطلاعات بیشتر جستجو کنید.

موفق باشید.

m_omrani
جمعه 24 دی 1389, 11:47 صبح
چیزی که دوست مون نیاز دارن نحوه ارسال Array یا List به Store Procedure هستش که همون طور که می دونید تکنیک های مختلفی در این خصوص هست و اگه دوست عزیز در این تالار جستجو کنن حتماً بحث های مفیدی رو پیدا می کنن.

قطعاً درج یکباره چندین رکورد با درج تک به تک اونها تفاوت داره و تا جای ممکن سعی کنید تمام دیتا رو یکجا به SQL Server بدید و همه رو یکجا درج کنید. اما چیزی که هست اینه که اگه برنامه تون تعداد کاربر کمی داره، این تفاوت اونقدرها محسوس نیست. خصوصاً اگه برنامه تون تک کاربره است نگران نباشید.

ولی توصیه می کنم از این جریان حُسن استفاده کنید و با تکنیک نحوه ارسال چندین رکورد و درج یکباره اونها در دیتابیس رو آشنا بشید. ممکنه کمی زحمت داشته باشه، اما به تجربه اش می ارزه، ممکنه بعداً یک جایی به کارتون بیاد.

اگه خواستید با تکنیک های مختلف این کار آشنا بشید یه نگاهی به این لینک بندازید:

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

کمی طولانیه ولی ارزش خوندن داره.

با احترام