PDA

View Full Version : سوال: update کردن جدول بر اساس فیلدی غیر از کلید اصلی



amir_ir
شنبه 09 آبان 1388, 01:04 صبح
سلام به دوستان عزیز
آیا جدولی را میشه بر اساس فیلدی غیر از کلید اصلی اون Update کرد ؟ مثلا در کد زیر :



with FrmDMTransport.ADOQGasCar do
begin
FrmDMTransport.ADOTGasCar.Active:=false;
FrmDMTransport.ADOQGasCar.SQL.Clear;
FrmDMTransport.ADOQGasCar.SQL.Text:=' Update Gas_Car set Pelak= '''+TxtUpCarPelak2.Text+''' WHERE Pelak='''+TxtUpCarPelak1.Text+''' ';
FrmDMTransport.ADOQGasCar.ExecSQL;
FrmDMTransport.ADOTGasCar.Active:=true;
FrmDMTransport.ADOTGasCar.Close;
FrmDMTransport.ADOTGasCar.open;
end;


در کد بالا پلاک ، کلید اصلی جدول Gas_Car نیست .
کد بالا زمان اجرا Error میده . آیا اصولن میشه همچین کاری کرد و روش اون به چه صورت هست؟
ممنون از همه دوستان

merced
شنبه 09 آبان 1388, 03:27 صبح
كد SQL درسته. فقط چرا بعد از ExecSQL دستور Active = True رو اجرا مي كني. همين باعث خطا مي شه

دلفــي
شنبه 09 آبان 1388, 09:03 صبح
with FrmDMTransport.ADOQGasCar do
begin
Active:=false;
SQL.Clear;
SQL.Add('Update Gas_Car set Pelak = '+QuotedStr(TxtUpCarPelak2.Text)+
' WHERE Pelak = '+QuotedStr(TxtUpCarPelak1.Text));
ExecSQL;
end;

amir_ir
شنبه 09 آبان 1388, 10:11 صبح
كد SQL درسته. فقط چرا بعد از ExecSQL دستور Active = True رو اجرا مي كني. همين باعث خطا مي شه

سلام
ممنون . حق با شماست . چرا با False و True کردن اکتیو AdoT خطا ایجاد میشه؟
یک سوال کلی؟

1)چه زمانی اکتیو Adotable بایستی False و True بشه و چه زمانی AdoQuery ؟
منظورم در دستورهای Select ، insert ، update ، Delete هست.

2) چه زمانی باید close و Open بشه؟ (اصولا بین False و True کردن و Close وopen کردن چه تفاوتی هست؟)

از همه دوستان عزیز ممنون
شاد و پیروز

Hadi_Fayyaz
شنبه 09 آبان 1388, 12:41 عصر
سلام دوست عزيز
در ADOQuery شما ميتونيد دستورات SQL رو بنويسيد و اجرا كنيد اما اگه نتيجه دستوري كه اجرا ميكنيد يك جدول باشه مثل نتيجه دستور Select اونوقت بايد ADOQuery رو Open كنيد ولي وقتي دستوري كه در ADOQuery مينويسيد فقط تغييري روي DataBase اعمال ميكنه يا عمليات خاصي رو انجام ميده كه خروجي به شكل جدول نداره اونوقت بايد از دستور ExecSQL استفاده كنيد.
اما بين False و True كردن جدولها و چه از نوع Query و چه از نوع Table و ‍Closeو Open كردن اونها هيچ تفاوتي وجود نداره اشكالي هم كه در برنامه شما بوده بخاطر تفاوت بين Trueو False كردن با Open و Close كردن AdoQuery نبوده بلكه به خاطر اينه كه شما دستور Update رو داخل ADoQuery نوشتيد كه نتيجه اون يك جدول نيست بلكه تغييراتي رو در DataBase اعمال ميكنه و بعد خواستيد ADOQuery رو Open كنيد يا Active اون رو True كنيد.
به هر حال همونطور كه گفتم براي دستور هايي كه خروجي اونها جدول نيست مثل Update,Delete,Insert,... حتما بايد از ExecSQL استفاده كنيد. كه دوست عزيزمون هم اين مطلب رو به درستي بيان كرده اند.