ورود

View Full Version : سوال: دلفی-sql- برگردوندن تغییرات روی تیبل



آماتور دلفی
شنبه 18 دی 1389, 14:00 عصر
اولا خسته نباشید . دوما من یه مشکل دارم توی وایل زیر باید کل وایل بره تا متغیر mab رو حساب کنم ولی اگه وایل تموم شد و اون شرط اخرش درست نبود میخام این تغییرات توی کوری اعمال نشه . ایا راه حلی هست ؟


while not eof(f) do
begin
readln(f,e);
if e<>'' then
begin
t:=t+1;
i:=strtoint64(copy(e,19,15));
mab:=mab+i ;
Query2.close;
Query2.SQL.Clear;
Query2.SQL.Add('insert into tajmi.db ');
Query2.SQL.Add('(rad,hes,mab,cod)');
Query2.SQL.Add(' values (');
Query2.SQL.Add(' '''+copy(e,1,5)+''',');
Query2.SQL.Add(' '''+copy(e,6,13)+''',');
Query2.SQL.Add(' '''+copy(e,19,15)+''',');
Query2.SQL.Add(' '''+s+''')');
Query2.ExecSQL;

end; //if
end;//while
if mab<>mabk then
showmessage('اینجا اگه اومد توی این قسمت باید تغییرات اعمال نشه !! ');
if t<>tk then
showmessage('و همینطور اینجا!!! ');

vcldeveloper
یک شنبه 19 دی 1389, 11:33 صبح
می تونید از Transaction استفاده کنید، و تغییرات را در صورت لزوم rollback کنید. اینکه آیا می تونید از Transaction استفاده کنید، یا اینکه چطور باید از آن استفاده کنید، بستگی به نوع بانک اطلاعاتی مورد استفاده و ابزاری که با آن به بانک وصل میشید، داره.

در ضمن، مراحل ساخت اون کوئری رو از داخل حلقه بیارید بیرون، و به جاش از یک کوئری همراه با پارامتر استفاده کنید. در اون کد SQL، همه چیز به جز مقادیر درج شده در گزاره VALUES ثابت هست؛ دلیلی نداره که همچین چیزی رو هر بار بسازید، و کارایی کد را به شدت پایین بیارید.

آماتور دلفی
یک شنبه 19 دی 1389, 13:30 عصر
ببخشید میشه یه نمونه کد از اون کوئری با پارامتر که بیرون وایل باشه برام بنویسید ؟

vcldeveloper
یک شنبه 19 دی 1389, 16:10 عصر
ببخشید میشه یه نمونه کد از اون کوئری با پارامتر که بیرون وایل باشه برام بنویسید ؟

Query2.SQL.Text := 'insert into tajmi.db (rad,hes,mab,cod) values (:prmRad, :prmHes, :prmMab, :prmCod);';
Query2.Prepared := True;
while not eof(f) do
begin
readln(f,e);
if e <> '' then
begin
t := t+1;
i := strtoint64(copy(e,19,15));
mab := mab+i ;
Query2.Params.ParamByName('prmRad').Value := Copy(e,1,5);
Query2.Params.ParamByName('prmHes').Value := Copy(e,6,13);
Query2.Params.ParamByName('prmMab').Value := Copy(e,19,15);
Query2.Params.ParamByName('prmCod').Value := s;
Query2.ExecSQL;
end; //if
end;//while