PDA

View Full Version : تغییر خصیصه های یک TableAdapter



piroozman
شنبه 14 شهریور 1388, 09:39 صبح
چگونه می توان خصیصه های یک TableAdapter را در حین اجرا (Runtime) تغییر داد. هر شی TableAdapter دارای خصیصه هایی مانند دستور ات selectcommand ، insertcommand ، parameters و غیره است. بنده می خواهم در حین اجرا برخی از اینها را تغییر بدهم. آیا امکانش هست؟
اصل کاری که می خواهم انجام به شرح ذیل است:
فرض کنیم سه جدول به شرح ذیل در دیتابیس داریم:
1- جدول State : دارای دو ستون : StateId و StateName که ستون StateId به صورت uniqe و ستون StateName به صورت primary key تعریف شده اند
2- جدول City: دارای سه ستون : CityId به صورت Uniqe و ستون های CityName و StateId که دو ستون آخر PK بوده و ستون StateId نیز کلید خارجی از جدول State (جدول شماره 1( می باشد.
3- نهایتا جدول Student: در این جدول ستونی به نام CityId وجود دارد که کلید خارجی از جدول City است به همراه سایر ستونها مانند نام نام خانوادگی و . . . .
جهت درج ID مربوط به شهر محل سکونت هر دانشجو می بایست بر اساس نام استان و نام شهر مقدار CityId از جدول City استخراج شده و در جدول Student درج شود. برای این کار می توان در Sql یک DML به شکل زیر نوشت




declare @cityId int
select @CityId=CityId from City


Where CityName=N'قم'

and StateId =

(
select stateId from state
where stateName=N'قم'
)
insert into student
(firstname,lastname,cityid)
values ('محمد',
'محمدی پیروز',
@cityId
)






در UpdataCommand مربوط به TableAdapter مر بوط به جدولی از Dataset با نام student دستور updata به شکل زیر است:
[code]

insert into student


(firstname,lastname,cityid)


values (@firstname,

@lastname,

@cityId(






سورس دو پارامتر @firstname و @lastname به دو ستون sudetn datatable با نامهای firstname و lastname است و می بایست مقدار پارامتر @cityid با استفاده از داده های دو ستون statename و cityname موجود در Sudent datatable محاسبه شده و به insert command داده شود.
حالا مشکل اینجاست که چگونه می توانم با استفاده از فقط خصیصه های خود tableadapter این کار را انجام بدم. لازم به ذکر است دستور Select ای را که در کد اول نوشتم به کد دوم در خصیصه insertcommand مربوط به Tableadapter اضافه کردم ولی اجرا نمی شود. به طوری که پارامترهایی که تعریف کرده ام خود به خود پاک می شود و با خطا مواجه می شوم. ضمنا sudent datatable دارای چهار ستون با نامهای firstname,lastname,cityname,statenaem است که با استفاده از سه جدول اصلی موجود در دیتابیس پر می شود.

piroozman
یک شنبه 15 شهریور 1388, 08:54 صبح
با توجه به این که دیدم کسی جواب این تاپیک را نداد، یافته های خودم را که مشکلم را دیروز حل کرد به شرح ذیل خدمت دوستانی که شاید با همین مشکل مواجه شده باشند ارائه می دهم. از کلیه دوستانی که مطلب فوق را مطالعه می کنند خواهش می کنم سر سری از مسئله نگذشته و ضمن مطالعه پست اول، این پست را دقت مضاعف مطالعه کنند. اگر سئوالی هم داشتید مطرح کنید انشاله اگر توانستم پاسخ خواهد داد.
بهترین کار برای حل مشکل این تاپیک این است که از پروسیجرها استفاده کنیم. هر Tableadapter چهار خصیصه مهم به شرح ذیل دارند:
1- selectcommadn
2-insertcommand
3-deletecommand
4-updatacommand
و هر کدام از کامندهای فوق نیز خود از سه قسمت تشکل شده اند:
1- commandtext
2-commandtype
3-parameters
فرض کنیم شما می خواهید در داخل جدول دانشجو یک رکود ایجاد کنید ابتدا پروسیجری در بانک اطلاعاتی مربوطه به شکل زیر ایجاد کنید:



CREATE PROCEDURE [dbo].[InsertToStudentTable]
-- Add the parameters for the stored procedure here
@firstName nvarchar(50),
@LastName nvarchar(50),
@cityName nvarchar(50),
@stateName nvarchar(50),
@cityId tinyint=0
AS
BEGIN
-- Insert statements for procedure here
SELECT @cityId=c.cityId from city c where
cityName=@cityName and c.stateId =
(
select stateId from state where stateName=@stateName
)
INSERT INTO Student
(FirstName
,LastName
,CityId)
VALUES
(@firstName
,@lastName
,@cityId)
END

همانطور که می بینید پروسیجر فوق دارای چهار پارامتر است. یکی از پارامترهای آن (@cityId) در داخل خود پروسیجر با استفاده از دستور Select و با استفاده از دو پارامتر @cityName و @stateName به دست می آید و سپس عملیات insert در داخل جدول شروع می شود.
البته برای دستور select می توانید یک function از نوع scalar نیز نوشته و در داخل پروسیجر به کار ببرید و پارامترهای مورد نیاز به function ارسال کنید ولی چون دستور select خیلی بزرگ نبود از نوشتن Function صرفنظر شد.
به visual studio برگشته tableadapter مورد نظر را انتخاب کرده و زبانه properties را باز کنید. خصیصه insertcommand را انتخاب کنید. commandtype را انتخاب کنید و نوع آنرا Storepcedure انتخاب کنید. سپس به قسمت commandtext رفته و پروسیجر نوشته شده را انتخاب کنید. visual پارامترهایی را که در پروسیجر مشاهده می کند به پارامترهای insertcommand می افزاید. البته شما در پارامترهای درج شده در خصیصه parameters نیازی به پارامتر @cityId نخواهید داشت. به یاد داشته باشید که هر یک از پارامترهایی که به قسمت parameters اضافه شده است باید به یک ستون از dataTable ی که tableAdapter به آن بایند شده است وصل کنید. برای این کار در قسمت parameters پس از انتخاب هر پارامتر در ردیف sourceColumn ستون مورد نظر خود را از datatable مورد نظر خود انتخاب کنید. به طور مثال برای پارامتر @firstName می بایست ستون FirstName را انتخاب کنید. نقش ردیف source version در قسمت parameters بسیار مهم است. اگر شما قصد دارید داده های قبلی موجود در datatable را که توسط کاربری تغییر یافته است به بانک اطلاعاتی ارسال نمایید می باید نوع sourceversion را از نوع orginal انتخاب کنید چون مقدار Current مقدار جاری و مقداری که کاربر به تازگی تغییر یا ایجاد کرده است را می پذیرد. برای روشن شدن بهتر مسئله فرض کنیم ستون lastname کلید اولیه جدول شما باشد و شما می خواهید یک دستور updata را به شکلی که در اینجا توضیح داده شده است ایجاد کنید. اگر در ردیفی از داده های table شما مقدار lastname برابر با "محمدی" باشد و شما بخواهید آنرا به "محمدی پیروز" تغییر دهید می بایست در داخل جدول خود به دنبال کلید اصلی " محمدی " گشته و آنرا تبدیل به " محمدی پیروز" کنید. مقدار "محمدی" به صورت sourceversion از نوع orginal و مقدار "محمدی پیروز" می بایست از نوع current انتخاب شود. بنابراین در updatacommand برای کلیدها اصلی باید دو پارامتر Set کنید، یکی برای مقدار اصلی و دیگری برای مقداری جاری. شما با استفاده از پارامترهای مقدار اصلی (یا همان orginal) رکورد مورد نظر خود را در table مورد نظر خواهید یافت و با استفاده از پارامتر جاری (یا همان Current) مقدار آنرا تغییرخواهید داد. به کد زیر توجه کنید:


CREATE PROCEDURE [dbo].[UpdataStudentTable]
-- Add the parameters for the stored procedure here
@firstName nvarchar(50),
@current_LastName nvarchar(50),
@orginal_LastName nvarchar(50),
@cityName nvarchar(50),
@stateName nvarchar(50),
@cityId tinyint=0
AS
BEGIN
-- Insert statements for procedure here
SELECT @cityId=c.cityId from city c where
cityName=@cityName and c.stateId =
(
select stateId from state where stateName=@stateName
)
UPDATE Student
SET [FirstName] = @firstName
,[LastName] = @current_LastName
,[CityId] = @cityId
WHERE FirstName=@orginal_LastName
END

کد فوق نیز یک پروسیجر است که می تواند جدول student را به روز رسانی کند و مراحل تنظیم آن برای Tableadapter همانند مراحل مربوط به insertCommand می باشد.