PDA

View Full Version : سوال: آپديت همزمان چند سطر از يك فيلد در ديتابيس



vb_nima
شنبه 08 اسفند 1388, 03:05 صبح
سلام دوستان.
اين سناريو را در نظر بگيريد:
يك فروشگاه داريم. صفحه اي مربوط به مسئول "بسته بندي و پست" كه اطلاعات مربوط به سفارشات را در يك gridview مي بينه. مسئول پست بعد از پست سفارشها بايد به صفحه مراجعه كنه و تاريخ ارسال سفارشها را وارد كنه و كليد "ثبت" را كليك كند.
خوب مشخص است كه همه سفارشها را در يك تاريخ ارسال نمي كند.
حالا من واسه اينكه وقتي كليد ثبت كليك شد يكجا تاريخ بعضي سفارشها را آپديت كنم بايد چه كار كنم؟
فكر كنم براي اين كار بايد يك column به گريد اضافه كنم و در بخش template يك كنترل calendar اضافه كنم. خوب وقتي كاربر ثبت را كليك كرد چه كاري بايد انجام بدم؟
آيا نميشه توسط 2 آرايه يكي براي كليد سطرها و يكي براي تاريخ مقادير را به دستور Update‌ بفرشتم؟
البته يه مدل از دستور Update را ديدم كه با استفاده از case ,when,then مثل سويچ عمل ميكرد و مقادير متفاوت را آپديت ميكرد ولي در اونجا مقادير از قبل مشخص بود.
در ضمن نميخوام از يك for‌استفاده كنم و براي هر سطر يكبار update‌را صدا كنم چون به نظرم يه جورايي اين روش منطقي نيست. دنبال يك روش درست ميگردم و فكر ميكنم وجود داشته باشه.

hajizahiry
شنبه 08 اسفند 1388, 10:09 صبح
دوست عزیز می توانی از cursor در sql server استفاده کنید
ووردی س پی ات دو رشته باشد که مقادیر کلید رکورد و تاریخ با , از هم جدا شده باشد :
برای جدا سازی مقادیر از , از تابع زیر استفاده کن

ALTER FUNCTION [dbo].[Split](@String nvarchar(max),@Delimiter char(1))
RETURNS @t table (DataColumn nvarchar(max)) AS
BEGIN
declare @IsLastItem bit
declare @DelimiterPosition int
declare @StartPosition int
set @IsLastItem=0
set @DelimiterPosition=0
set @StartPosition=0
--to see if
begin
while @IsLastItem=0
begin
set @DelimiterPosition=charindex(@Delimiter,@String,@S tartPosition)
if @DelimiterPosition=0
begin
insert into @t values(substring(@String,@StartPosition,len(@Strin g)-@StartPosition+1))
set @IsLastItem=1
end
else
begin
insert into @t values(substring(@String,@StartPosition,@Delimiter Position-@StartPosition))
set @StartPosition=@DelimiterPosition+1
end
end
end
return
END

پیاده سازی اس پی update هم با دانستن استفاده از cursor و تابع split مشکلی ندارد

nPad.Net
چهارشنبه 19 اسفند 1388, 12:55 عصر
در ضمن نميخوام از يك for‌استفاده كنم و براي هر سطر يكبار update‌را صدا كنم چون به نظرم يه جورايي اين روش منطقي نيست. دنبال يك روش درست ميگردم و فكر ميكنم وجود داشته باشه.


میشه لطفا علت منطقی نبودن update سطرها رو با یه for توضیح بدید؟:متعجب::اشتباه:
آخه منم یه همچین مشکلی دارم که میخوام مثلا یه لیست ازرکوردای tbl1 رو توگرید نشون بدم(درواقع از فیلدای رکوردای tbl1 میخوام به عنوان labelی جهت اطلاع کاربر استفاده کنم) و2تا itemTemplate به اون اضافه کنم و با زدن دکمه ثبت محتوای دو تا item گریدمو به tbl2 اضافه کنم.در واقع 2ستون از این گرید رو میخوام داشته باشم!
از این تابع هم چیزی متوجه نشدم من نمیخوام به ازای هر یه سطر از گرید روی دکمه ثبت مربوط به اون سطر کلیک کنم.میخوام که کل سطرهای دو ستونم رو یکجا ثبت کنم

اگه کسی به جوابی رسیده میشه لطفا منو هم راهنمایی کنید
خیلی ممنونم

mehdi.mousavi
چهارشنبه 19 اسفند 1388, 14:13 عصر
سلام. خوب مشخص است كه همه سفارشها را در يك تاريخ ارسال نمي كند. حالا من واسه اينكه وقتي كليد ثبت كليك شد يكجا تاريخ بعضي سفارشها را آپديت كنم بايد چه كار كنم؟

سلام.
وقتی کلید ثبت زده میشه، شما میتونید توی Click Handler اون Button، توی یک Loop (بازای هر Row)، تغییرات هر ردیف رو بگیرید و در یک Container نگهداری کنید (مثل DataSet، Custom Object یا هر چیز دیگه ای). دقت کنید. فقط تغییرات! سپس، این تغییرات رو می تونید به یک Stored Procedure ارسال کنید تا همه رو با هم در یک مرحله، Insert یا Update کنید. البته خود در این روش، Round-trip کمتری به RDBMS وجود خواهد داشت، اما استخراج و مدیریت تغییرات نیز کار دشوارتری هستش.

شما میتونید برای آشنایی با Bulk Edit کردن در GridView این مقاله رو بخونید (http://blogs.msdn.com/mattdotson/articles/490868.aspx). دقت کنید! توی این مقاله، تک تک Row ها جداگانه در RDBMS به روز میشن... اما نحوه نمایش GridView توی این حالت خیلی مهمه، که این مقاله خوب اونو توضیح میده.

موفق باشید.

mehdi.mousavi
چهارشنبه 19 اسفند 1388, 14:17 عصر
میشه لطفا علت منطقی نبودن update سطرها رو با یه for توضیح بدید؟ خیلی ممنونم

سلام.
در واقع بهتره بگیم Optimize و مقرون به صرفه نیست، نه اینکه منطقی نیست. چرا که برای Update شدن هر رکورد، باید یکبار با بانک ارتباط برقرار بشه، داده ها به سمت بانک ارسال بشه و اونجا ذخیره بشن. در صورتیکه میشه کلیه ردیف ها رو با هم طی یک "رفت و برگشت" به بانک در بانک ذخیره کرد. روش دوم بدون شک از نظر کارایی بهتره، اما "پیاده سازی خوب" این روش، مستلزم صرف دقت و زمان بیشتر نیز هست.

موفق باشید.

nPad.Net
پنج شنبه 20 اسفند 1388, 10:40 صبح
با تشکر از دوست خوبمون mehdi.mousavi به خاطر راهنمایی عالی که داشتن

برا اون دسته از دوستانی که قصد دارن یه GridViwe با خاصیت Bulk Edit داشته باشن و انتخاب سطرایی که میخوان به صورت گروهی ویرایش کنند رو به یه ChecKBox بسپارند،
این مقاله کمک زیادی می تونه ارائه بده
البته اینو هم بگم که کار update رو تو یه for داره انجام میده.ولی میتونید از ایده قشنگ mehdi.mousavi استفاده کنید!
فایل پروژه به همراه توضیحاتش رو از این لینک ببینید:

http://csharpdotnetfreak.blogspot.com/2009/05/edit-multiple-records-gridview-checkbox.html

موفق باشید