PDA

View Full Version : ارتباط sqlserver باdelphi



shining_eye
یک شنبه 31 مرداد 1389, 08:25 صبح
من یه دیتا بیس دارم که توش چندتا جدول و storedprocهست با sqlserver2000کار کردم.
حالا میخوام sql رو از طریق bde ارتباط بدم به delphi7 (از BDEمی خوام استفاده کنم چون قبلا یه برنامه نوشته بودم با استفاده از تب های BDEوالان می خوام از همونا استفاده کنم).خواهشا یه راهنمایی کامل کنید.خیلی عجله دارم واسه این برنامه.

حمیدرضاصادقیان
یک شنبه 31 مرداد 1389, 08:53 صبح
سلام.دوست عزیز استفاده از Ado که خیلی راحتتره تا bde . میخوای خودتو به دردسر بندازی؟؟؟
یک Adoconnection بذار روی فرمت بعد در خاصیت Connection اون به دیتابیست وصل کن بعد یک adoquery هم بذار خاصیت Connection اونو به Adoconnection وصل کن .همین.
موفق باشید

shining_eye
یک شنبه 31 مرداد 1389, 10:42 صبح
من از adoاستفاده کردم و به هم ارتباطشون هم دادم ولی مشکل من اینجاست که 3تا Spدارم مال حذف و درج و ویرایش که وقتی میخوام تو دلفی با adostoredproc کدهاشون رو بنویسم دچار مشکل میشم. من این کدها رو قبلا برای BDEنوشته بودم و چون عجله دارم می خواستم از اونا استفاده کنم.



procedure TForm1.Button4Click(Sender: TObject);
begin
begin
Table1.setkey;
table1.fieldbyname('lid').asstring:=edit2.text;
if table1.GotoKey then
begin
uplesson.Prepare ;
uplesson.ParamByName('@lid').AsString ;
uplesson.ParamByName('@lesson_name').AsString ;
uplesson.ParamByName('@unit').AsString ;
uplesson.ExecProc ;
end
else
messagedlg('not found',mtinformation,[mbok],0);
end;
end;
///////////////////////////////////////////////
procedure TForm1.Button2Click(Sender: TObject);
begin
inslesson.Prepare ;
inslesson.ParamByName('@lesson_name').AsString:=db edit2.Text ;
inslesson.ParamByName('@unit').AsInteger :=strtoint(dbedit3.Text) ;
inslesson.ExecProc ;
end;


این کدهای منه.اگه ممکنه یه راهنمایی بکنید تا من بتونم این کد ها رو تغییر بدم.
مخصوصا این 3 خط کد:



Table1.setkey;
table1.fieldbyname('lid').asstring:=edit2.text;
if table1.GotoKey then



برای استفاده از locatبه جای setkey چهاگر 2تا فیلد همزمان کلید باشند باید چه طور بنویسم.keyvalueمون رو باید 2تاشون بزارم ؟اگه ممکنه یه مثال بزنید.

حمیدرضاصادقیان
یک شنبه 31 مرداد 1389, 11:27 صبح
سلام.ببینید برای تغییر این کد از روش زیر میتونید استفاده کنید:
مثال :


if Adoquery1.Locate('Field1;field2',VarArrayOf([edit1.text,
Edit2.text]),[]) then


برای استفاده از procedure میتونید از روش زیر استفاده کنید.
مثال:


with DmAdo.AdoSpTemp Do
Begin
Close;
Parameters.Clear;
ProcedureName:='UspNextRecord';
Parameters.AddParameter.Name:='Table';
Parameters.AddParameter.Name:='Code';
Parameters.AddParameter.Name:='Field';

Parameters[0].Value:=Table;
Parameters[1].Value:=Code;
Parameters[2].Value:=Field;
open;
End;

shining_eye
یک شنبه 31 مرداد 1389, 13:29 عصر
میشه به کدهام یه نگاه بندازید ببینیدerrorهاش مال چیه؟
یکی ازerror هاش dose not return result value بود که من اصلا open نکردم فقط inscdtable.execproc نوشتم ولی نمی دونم چرا این error رو میگیره.
یکی از errorهای دیگه هم wrongtypeو out of rangهست که بازم دلیلش رو می خوام بدونم.
توی ADOخب فقط این کد رو میشه نوشت :



inscdtable.Parameters.paramByName('@box_number').V alue:=edit1.Text ;


نمیشه که ازتبدیل نوع asstring یا چیز دیگه ای استفاده کرد.حالا باید چه تغییراتی بدم؟

این همstored procedure هامه.



create procedure spdelete_cdtable(@box_number int,@cd_number int)
as
begin
delete from cdtable
where box_number=@box_number and cd_number=@cd_number
end
////////////////////////////////////////////
CREATE procedure spinsert_cdtable(@box_number int,@cd_number int,@cd_name varchar(50),@cd_content varchar(3000))
as
begin
insert into cdtable
values(@box_number ,@cd_number ,@cd_name ,@cd_content )
end
GO
///////////////////////////////////////////
create procedure spupdate_cdtable(@box_number int,@cd_number int,@cd_name varchar(50),@cd_content varchar(3000))
as
begin
update cdtable
set cd_name=@cd_name ,cd_content=@cd_content
where box_number=@box_number and cd_number=@cd_number
end

حمیدرضاصادقیان
یک شنبه 31 مرداد 1389, 13:45 عصر
میشه به کدهام یه نگاه بندازید ببینیدerrorهاش مال چیه؟
یکی ازerror هاش dose not return result value بود که من اصلا open نکردم فقط inscdtable.execproc نوشتم ولی نمی دونم چرا این error رو میگیره.
یکی از errorهای دیگه هم wrongtypeو out of rangهست که بازم دلیلش رو می خوام بدونم.
توی ADOخب فقط این کد رو میشه نوشت :



inscdtable.Parameters.paramByName('@box_number').V alue:=edit1.Text ;


نمیشه که ازتبدیل نوع asstring یا چیز دیگه ای استفاده کرد.حالا باید چه تغییراتی بدم؟

دوست عزیزم backup دیتابیس هم بده که بشه تست کرد.

حمیدرضاصادقیان
یک شنبه 31 مرداد 1389, 15:02 عصر
سلام.من یک سری تغییرات دادم.
AdoProcedure های مربوط به update,delete نه به جایی وصل بودند نه پارامترهاش مشخص بود.اونها رو هم وصل کنیدو در لیست پارامترها اولین پارامتر returnvalue رو هم حذف کنید.
موفق باشید

shining_eye
دوشنبه 01 شهریور 1389, 08:06 صبح
سلام.اونجایی که گفته بودین نام پراسیجر معلوم نیست نامش رو که نوشتم



upcdtable.Close;
upcdtable.Parameters.ParamByName('@box_number').Va lue;
upcdtable.Parameters.ParamByName('@cd_number').Val ue;
upcdtable.Parameters.ParamByName('@cd_name').Value ;
upcdtable.Parameters.ParamByName('@cd_content').Va lue;
upcdtable.ExecProc;


upcdtable نام پراسیجرم وbox_number , @cd_numer @و...نام پارامترهامن
ولی هنوز error هاش سر جاشن؟
بفرماید اینم back up دیتا بیسم

shining_eye
دوشنبه 01 شهریور 1389, 08:50 صبح
این errorهای برنامه من.مشکل از کجای کاره؟

حمیدرضاصادقیان
دوشنبه 01 شهریور 1389, 09:05 صبح
سلام.این برنامه شما پر از اشکاله.من چند مورد رو در سورس توضیح نوشتم. ایرادهاش هم رفع شد.
شما پارامتر تعریف کردی ولی هیچ مقداری بهش پاس ندادی.خوب باید چکاری برات انجام بده؟؟؟
در ضمن وقتی میگم نام پراسیجر مشخص نیست منظورم نام کامپوننت نیست!!!!
خود AdoStoredProc یک خاصیت به نام Procedure Name داره که خالی بود همچنین خاصیت Connection اون.
ایرادهای مربوط به Locate هم مربوط میشه به این که شما نام Edit ها رو اشتباه نوشتی.
الان گزینه هاش کار میکنن ولی کل سورس عملا غلطه.
موفق باشی.

shining_eye
دوشنبه 01 شهریور 1389, 11:23 صبح
حق با شماست.من اشتباها این فایل رو گذاشته بودم.(امروز دیدم که چی برا شما فرستادم:خجالت:)ولی این اشتباهاتی که شما گفتید رو تو برنامه اصلی م نداشتم ولی باز error میداد.چه طور باید به پارامترها مقدار بدم.مگه نباید از طریق برنامه ای که تو دلفی می نویسم از طریق گزینه درج بهش مقدار بدم؟(اگه سوالام خیلی ساده است ببخشید.سعی میکنم تکرار نشه).
منظورتون چیه که کل سورس غلطه؟؟؟؟(خیلی نسبت به خودم نا امید شدم)

حمیدرضاصادقیان
دوشنبه 01 شهریور 1389, 11:37 صبح
سلام.برای مقدار دادن به پارامتر باید یک چیزی بهش پاس بدی. مثلا چند تا Edit روی صفحه گذاشتی باید مقادیر اون Edit هارو بهش پاس بدی.اگر میخوای با خود dbgrid اصلاح انجام بدی که اصلا نیازی به اون پروسیجر و کدنویسی نداره. فقط کافیه در پراپرتی های گرید کزینه edit رو فعال کنی.
هر ردیفی رو که اصلاح کردی خودش در دیتابیس اعمال میشه.
ولی با این روش شما نیازی نیست کد سی دی رو از کاربر بگیری.
وقتی کاربر در گرید روی یک رکورد واستاده میتونی در update چندتا Edit برای نام و ... بذاری و وقتی دکمه updAte زده شد باتوجه به رکوردی که dbgrid روش واستاده مقدار اون رکورد رو بروز کن.
چون گرید به یک DataSource وصل هست و روی هر رکوردی که جابجا میشی رکوردست هم جابجا میشه.
به همین خاطر فقط کافیه مقدار اون فیلدهای cd,box رو از خود Adotable بخونی.
امیدوارم متوجه شده باشی.

منظورم از اینکه کل سورس غلطه یعنی روی اصول درستی نوشته نشده.

حمیدرضاصادقیان
دوشنبه 01 شهریور 1389, 11:43 صبح
درضمن همین کد اخری که فرستادم رو نگاه کن همونو تغییر بده.

shining_eye
سه شنبه 02 شهریور 1389, 09:34 صبح
(من می خوام که حتما از sp هام استفاده کنم نه ازویپگی های dbgrid )
همه این تغییرات رو دادم ولی غیر از دکمه سرچ هیچکدوم کار نمی کنن؟؟؟
واقعا دیگه نمی دونم ایراد کارم از کجاست. spهام تو sql هجرا میشن ولی چرا تو دلفی اجرا نمی شن؟ همه ارتباطا رو هم چک کردم.دوباره فایل تصحیح کردم رو گذاشتم.
دیتا بیسم هم قبلاگذاشتم.

shining_eye
چهارشنبه 03 شهریور 1389, 08:09 صبح
کد شما رو نمی دونم چرا ولی تو دلفی که باز می کنم اجراش که می کنم فقط صفحه فرم می آد ولی هیچکدوم از دکمه ها کار نمی کنن.شما تستش کرده بودین؟؟
--------------------
من یه راهنمایی می خوام. (مشکل کد من کجاست که اجرا نمیشه؟)