View Full Version : کار با sql در دلفی
farzane_fn
شنبه 21 شهریور 1388, 04:18 صبح
دوستان عزیزم سلام . من می خوام بفهمم وقتی توی دلفی با عنصر adoconnection و عنصر adoquery کار می کنیم و درون بانک ما یک فیلد کلیدی وجود داره می خوام بدونم چه کدی باید بنویسم که اگه یه داده ای تکراری وارد بشه - توی فیلد کلیدی- پیام مناسبی نمایش داده بشه.مثلا "این شماره تکراری است". ممنون می شم اگه کمکم کنین
parastoo_zamani
شنبه 21 شهریور 1388, 06:32 صبح
اينم كد :
ADOQuery1.Active := False;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('Select * From Table WHERE Field = '+Key);
ADOQuery1.ExecSQL;
ADOQuery1.Active := True;
if ADOQuery1.IsEmpty = False then
ShowMessage('عبارت وارد شده تكراريست');
behnam_dr
دوشنبه 30 شهریور 1388, 12:46 عصر
البته شما میتونید کار بهینه تر انجام بدید . کد ذخیره سازی پس از درج رو در قالب try - except قرار بدید و یه پیغام فارسی هم تنظیم کنید. خوب وقتی خطا از کامپایلر صادر بشه اون پیغام فارسی شما نمایش داده میشه .
try
IF DataModule3.Table1.State In[DSEDIT,dsinsert] THEN
DataModule3.Table1.Post;
Except
ShowMessage(' داده تکراری است')
end;
farzane_fn
دوشنبه 30 شهریور 1388, 13:20 عصر
بهنام عزیزم من توی برنامه خودم از عنصر table استفاده نکرده ام بلکه از عنصرهای adoconnection و adoquery استفاده کرده ام.
behnam_dr
دوشنبه 30 شهریور 1388, 20:05 عصر
اوکی من مثال زدم شما اونو تبدیل کنید به adotable این فقط یه مثل بود منظور اصلی من استفاده از try-except بود خیلی مفید هست استفاده کنید
بهنام عزیزم من توی برنامه خودم از عنصر table استفاده نکرده ام بلکه از عنصرهای adoconnection و adoquery استفاده کرده ام.
matinebi
دوشنبه 30 شهریور 1388, 20:55 عصر
البته شما میتونید کار بهینه تر انجام بدید . کد ذخیره سازی پس از درج رو در قالب try - except قرار بدید و یه پیغام فارسی هم تنظیم کنید. خوب وقتی خطا از کامپایلر صادر بشه اون پیغام فارسی شما نمایش داده میشه .
try
IF DataModule3.Table1.State In[DSEDIT,dsinsert] THEN
DataModule3.Table1.Post;
Except
ShowMessage(' داده تکراری است')
end;
لطفا در مورد DSEDIT و dsinsert توضیح دهید
با تشکر
behnam_dr
سه شنبه 31 شهریور 1388, 11:21 صبح
DsEdit,DsInsert وضعیت تیبل رو چک میکنه . من در دستور گفتم که در صورتی که در حالت ادیت یا insert هست اجازه ذخیره سازی داری. البته این قسمت پاسخم اصلا مربوط به سوال اصلی تاپیک نیست قسمت اصلی استفاده از قالبهای خطایاب (Try -except) هست که قبلا توضیج دادم
ضمنا اگه خواستید از دستورات dsedit,... استفاده کنید حتما باید در کلاسها DB رو تعریف کنید- پیروز باشید.
amir_ir
جمعه 03 مهر 1388, 20:45 عصر
DsEdit,DsInsert وضعیت تیبل رو چک میکنه . من در دستور گفتم که در صورتی که در حالت ادیت یا insert هست اجازه ذخیره سازی داری. البته این قسمت پاسخم اصلا مربوط به سوال اصلی تاپیک نیست قسمت اصلی استفاده از قالبهای خطایاب (Try -except) هست که قبلا توضیج دادم
ضمنا اگه خواستید از دستورات dsedit,... استفاده کنید حتما باید در کلاسها DB رو تعریف کنید- پیروز باشید.
سلام
میشه لطف کنید و توضیح بیشتری بدید که Db چیه و چی باید تعریف کرد؟
ممنون
Ahmad Chehreghani
جمعه 03 مهر 1388, 21:36 عصر
DsEdit,DsInsert وضعیت تیبل رو چک میکنه . من در دستور گفتم که در صورتی که در حالت ادیت یا insert هست اجازه ذخیره سازی داری. البته این قسمت پاسخم اصلا مربوط به سوال اصلی تاپیک نیست قسمت اصلی استفاده از قالبهای خطایاب (Try -except) هست که قبلا توضیج دادم
گفته دوستمون رو اصلاح ميکنم:DsEdit,DsInsert وضعيت رو چک نميکنه.
در دستور
Table1.State
State از نوع TDataSetState هستش که وضعيت فعلي dataset را نشون ميده. وقتي State برابر با dsInsert باشد يعني رکورد فعلي ، رکورد جديدي است که هنوز Post نشده و ميتونيد اون رو تغيير و Post کنيد يا اونو Cancel کنيد.
براي مشاهده بقيه حالت ها به راهنماي دلفي مراجعه کنيد.
ضمنا اگه خواستید از دستورات dsedit,... استفاده کنید حتما باید در کلاسها DB رو تعریف کنید- پیروز باشید.
DB يونيت (Unit) هستش نه کلاس پس در قسمت Uses نام DB رو اضافه ميکنيم.
merced
جمعه 03 مهر 1388, 21:46 عصر
دوستان عزیزم سلام . من می خوام بفهمم وقتی توی دلفی با عنصر adoconnection و عنصر adoquery کار می کنیم و درون بانک ما یک فیلد کلیدی وجود داره می خوام بدونم چه کدی باید بنویسم که اگه یه داده ای تکراری وارد بشه - توی فیلد کلیدی- پیام مناسبی نمایش داده بشه.مثلا "این شماره تکراری است". ممنون می شم اگه کمکم کنین
چرا از ايندكس Unique استفاده نمي كنيد ؟؟ (ضمنا گفتيد فيلد كليدي . فيلد كليدي unique است)
روي فيلدتون يك ايندكس بزنيد و مسئوليت چك كردن اين مسئله رو بر عهده DBMS بذاريد.
در برنامه به راحتي ميتونيد خطاي Duplicate رو هندل كنيد (استفاده از try..except).
و يا در رويداد OnPost Error
procedure TForm1.ADOTable1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
begin
if Pos('duplicate key', E.Message) > 0 then
ShowMessage('تكراري است')
else
ShowMessage('خطاي ناشناخته ' + E.Message);
Action := daAbort
;
end;
vBulletin® v4.2.5, Copyright ©2000-1404, Jelsoft Enterprises Ltd.