程式中一個ADOQuery,用ExecSQL執行一段SQL陳述句,怎樣知道執行結果是成功還是失敗?
怎樣看執行結果的回傳值?
有人說成功回傳1,失敗回傳0,怎樣看回傳值?
uj5u.com熱心網友回復:
adoquery1.recordcount這個就是回傳值uj5u.com熱心網友回復:
說錯了,是回傳的行數uj5u.com熱心網友回復:
tryADOQuery1.ExecSQL ;
except
showmessage('ERROR');
end;
uj5u.com熱心網友回復:
判斷sql陳述句是否錯誤可以按照這個
uj5u.com熱心網友回復:

參考結構
TRY
EXCEPT
END;
uj5u.com熱心網友回復:
可以把sql陳述句放在一個函式里,通過例外處理回傳值來判斷是否執行成功。
function ExceSQLTxt:boolean;
begin
result:=false;
try
{執行sql陳述句}
result:=true; {執行陳述句成功}
except
result:=false; {執行陳述句失敗}
end;
end;
{OR}
function ExceSQLTxt:string;
begin
result:='';
try
{執行sql陳述句}
result:=''; {執行陳述句成功}
except
on e:exception
result:=e.message; {執行陳述句失敗,回傳失敗資訊}
end;
end;
uj5u.com熱心網友回復:
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, Grids, DBGrids, DB, ADODB;
type
TForm1 = class(TForm)
ADOConnection1: TADOConnection;
ADOQuery1: TADOQuery;
DataSource1: TDataSource;
DBGrid1: TDBGrid;
Button1: TButton;
ListBox1: TListBox;
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure getADOConnectionError(vSql:string;vError: TStrings;vQuery:TADOQuery);
procedure execSQL(vSql:string;vQuery:TADOQuery);
begin
with vQuery do
begin
Close;
SQL.Clear;
SQL.Text:=vSql;
Open;
end;
end;
var
i:Integer;
begin
with vQuery.Connection do
try
execSQL(vSql,vQuery);
except
//取得產生的錯誤總數
//vError.Add(IntToStr(ConnectionObject.Errors.Count));
vError.Clear;
for I:=0 to ConnectionObject.Errors.Count-1 do
begin
vError.Add('錯誤碼 ='+IntToStr(ConnectionObject.Errors[i].Number));
vError.Add('錯誤源 ='+ConnectionObject.Errors[i].Source);
vError.Add('錯誤源生碼='+IntToStr(ConnectionObject.Errors[i].NativeError));
vError.Add('錯誤資訊='+ConnectionObject.Errors[i].Description);
end;
Exit;
end;
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
getADOConnectionError('select * AA BB ',ListBox1.Items,ADOQuery1);
end;
end.
uj5u.com熱心網友回復:
我是用的例外捕獲的方法TRY
EXCEPT
END
如果陳述句執行有問題會報例外的。
如果陳述句執行無問題,但是執行的結果不是我希望的,比如遇到事務回滾。
我會再查詢一下確認是否成功。
uj5u.com熱心網友回復:
......with qry2 do begin
close;
SQL.Clear;
SQL.Add('DECLARE @db_id int, @tbl_id int');
SQL.Add('USE drn');
SQL.Add('SET @db_id = DB_ID('+quotedstr('drn')+')');
SQL.Add('SET @tbl_id = OBJECT_ID('+quotedstr('[drn].[dbo].[lldata_'+tabledate+']')+')');
SQL.Add('DBCC PINTABLE (@db_id, @tbl_id)');
Execsql;
end;
.....
Execsql執行成功,但回傳-1是啥意思?
uj5u.com熱心網友回復:
ExecSQL執行回傳的是受影響的行數,“影響”包括增刪改等,比如說ExecSQL執行一個洗掉3條記錄的陳述句,成功洗掉了3條件就回傳3(只成功刪了2條也就回傳2),表示受影響的行數是3行,即有3行被洗掉了。插入、修改也是同理。回傳0,則是沒有任何一行受影響,那就是沒有增刪改到任何行,但是不表示ExecSQL失敗,ExecSQL只是提交一個sql陳述句,sql本身沒錯,操作失敗可能是其他原因,比如洗掉3跳記錄,其中有一條記錄有約束沒能操作成功。uj5u.com熱心網友回復:
大悟老師,答案,根本滿足樓主需要了。uj5u.com熱心網友回復:
那如果把ExecSQL換為Open并令qry2.ExecuteOptions:=[eoExecuteNoRecords];//查詢以不回傳記錄方式執行,報EOleException類例外訊息‘引數型別不正確,或不在可以接受的范圍之內,或與其它引數沖突’。回傳-1那到底指的是‘引數型別不正確’、‘不在可以接受的范圍之內’或‘與其它引數沖突?uj5u.com熱心網友回復:
ExeSQL,此函式是有回傳值的,回傳值 就是此次執行SQL 所影響的行數。uj5u.com熱心網友回復:
ExecSQL 回傳影響的記錄數轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/121115.html
標籤:數據庫相關
