ADOCommand 組件定義了對數據庫執行的命令。該組件主要用于SQL定義語句(DDL)或執行不帶返回結果集的指令或存儲過程。如果SQL語句帶有返回結果集,最好使用 ADODataSet、ADOQuery 或 ADOStoredProc 組件。
不帶有返回結果集的命令:
該屬性表示命令字符串,默認值為空字符串(‘’)。
表示如何處理 CommandText 屬性中的命令。取值為:
使用該屬性可優化 CommandText 屬性的執行。如果該屬性值為 cmdUnknown,系統的性能將會降低。如果CommandType屬性與CommandText屬性中的命令類型不匹配,執行時會產生錯誤。
執行命令需等待的時間,單位為 s,默認值 30。如果指定時間內沒有執行完命令,會產生錯誤,然后會自動取消命令的執行。該屬性值設置為 0,將無限期地等待,直到命令執行完。
指定執行前是否保存命令的編譯版本。如果設置為 True,在首次執行該組件的查詢前保存 CommandText 屬性中指定的已經準備好的查詢版本。這樣,首次執行會降低命令執行的速度,但在后續執行中可以直接事件編譯好的命令版本,這樣可以提高執行效率。如果設置False,將直接執行命令而不創建編譯版本。
該方法執行 CommandText 屬性中指定的SQL語句或存儲過程等命令。
ADOCommand組件的使用方法:
1.設置 CommandText 屬性
2.將 ADOCommand 組件綁定到打開的連接
3.設置 Prepared 屬性為True
4.調用 Execute 方法或 Open 方法
示例:通過表單界面插入數據到數據表。界面設計如下:
數據模塊如下圖:
數據模塊組件及屬性設置:
組件 | 屬性 | 值 |
ADOConnection1 | ConnectionString | Provider=MSDASQL.1;Persist Security Info=False;Data Source=demodb;Mode=ReadWrite; |
LoginPrompt | False | |
Connected | True | |
Mode | cmReadWrite | |
ADOTable1 | Connection | ADOConnection1 |
TableName | d_students | |
Readonly | True | |
Active | True | |
ADOCommand1 | Connection | ADOConnection1 |
CommandText | INSERT INTO d_students (student_id, "name", sex, chinese, math, english) VALUES(:studentId, :name, :sex, :chinese, :math, :english); | |
ADOCommand2 | Connection | ADOConnection1 |
CommandText | UPDATE d_students SET "name"=:name, sex=:sex, chinese=:chinese, math=:math, english=:english WHERE student_id=:studentId; | |
ADOCommand3 | Connection | ADOConnection1 |
CommandText | delete from d_students where student_id = :studentId | |
DataSource1 | DataSet | ADOTable1 |
主窗體如下圖:
主窗體組件及屬性:
組件 | 屬性 | 值 |
Panel1 | Caption | '' |
Align | alTop | |
Button1 | Caption | '新建' |
Button2 | Caption | '編輯' |
Button3 | Caption | '刪除' |
DBGrid1 | Align | alClient |
DataSource | DataModule2.DataSource1 |
表單窗體如下圖:
表單窗體組件及屬性:
組件 | 屬性 | 值 |
Label1 | Caption | '學號' |
Label2 | Caption | '姓名' |
Label3 | Caption | '性別' |
Label4 | Caption | '語文' |
Label5 | Caption | '數學' |
Label6 | Caption | '英語' |
Edit1 | Text | '' |
Edit2 | Text | '' |
CheckBox1 | Caption | '男' |
CheckBox2 | Caption | '女' |
Edit3 | Text | '' |
Edit4 | Text | '' |
Edit5 | Text | '' |
為了在主窗體與表單窗體之間傳遞數據,設計一個數據類,代碼如下:
unit Unit4;
interface
type
TStudent = class
studentId: String;
name: String;
sex: String;
chinese: Double;
math: Double;
english: Double;
end;
implementation
end.
主窗體代碼:
uses Unit2, Unit3, Unit4;
procedure TForm1.Button1Click(Sender: TObject);
begin
// 新建
Form3.isNew := True;
if Form3.ShowModal = mrOK then
with DataModule2.ADOQuery1 do
begin
Close;
Prepared := True;
Active := True;
end;
end;
procedure TForm1.Button2Click(Sender: TObject);
var
Student: TStudent;
begin
// 編輯
with DataModule2 do
begin
Student := TStudent.Create;
Student.studentId := ADOQuery1student_id.Value;
Student.name := ADOQuery1name.Value;
Student.sex := ADOQuery1sex.Value;
Student.chinese := ADOQuery1chinese.AsFloat;
Student.math := ADOQuery1math.AsFloat;
Student.english := ADOQuery1english.AsFloat;
end;
Form3.isNew := False;
Form3.CurrentStudent := Student;
if Form3.ShowModal = mrOK then
with DataModule2.ADOQuery1 do
begin
Close;
Prepared := True;
Active := True;
end;
end;
procedure TForm1.Button3Click(Sender: TObject);
begin
// 刪除
with DataModule2 do
begin
ADOCommand3.Parameters.ParamByName('studentId').Value := ADOQuery1student_id.Value;
ADOCommand3.Prepared := True;
ADOCommand3.Execute;
ADOQuery1.Close;
ADOQuery1.Prepared := True;
ADOQuery1.Active := True;
end;
end;
表單窗體代碼:
Delphi 的 ADO 組件中另外一個重要的數據集組件是 ADOQuery 組件,需要使用 SQL 語句來進行查詢。
在 Delphi 應用程序中使用的 SQL 語句可以分為兩種:靜態 SQL 語句和動態 SQL 語句。
靜態 SQL 語句在程序設計階段,將 SQL 語句作為 ADOQuery 組件的 SQL 屬性值設置,可以通過對象查看器進行設置。
動態 SQL 語句則在程序運行過程中進行設置,可以動態地給 SQL 語句的參數賦值。在代碼中實現查詢的步驟如下:
如:
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('select * from customers');
ADOQuery1.Open; 或者 ADOQuery1.ExecSQL;
可以通過設置 Active 屬性為 True 來執行 SQL 語句,一般情況下,通過 ExecSQL 來運行 SQL 語句。如果執行的 SQL 語句有結果集,則可與通過 Open 方法來運行 SQL 語句。
該屬性為 TParameters 類型,包含了 SQL 語句中使用的參數。在運行中可以訪問 Parameters 屬性中的參數,也可以通過該屬性給 SQL 參數進行賦值。如:
ADOQuery.SQL.Add(''SELECT * FROM customers WHERE customer_id = :AnId;');
Param := ADOQuery.Parameters.ParamByName('AnId');
Param.DataType := ftInteger;
Param.Value := 1;
ADOQuery.Prepared := true;
try
ADOQuery.Active := True;
except
on e: EADOError do
begin
MessageDlg('Error while doing query', mtError, [mbOK], 0);
Exit;
end;
end;
該屬性為動態 SQL 語句中存在未賦值的參數時,Delphi 會自動檢查 ADOQuery 組件的 DataSource 屬性,如果為該屬性設置了屬性值,則會把沒有賦值的參數與 DataSource 組件中的各個字段比較,自動將相應的字段賦值給與其相匹配的參數,實現連接查詢。
在執行查詢時,可以讓數據庫查詢分配資源并執行查詢優化,也稱為執行查詢前的準備工作。在執行查詢前設置該屬性為 True 會提高應用程序的性能。
SQL 語句可以分為兩種,帶有結果集的查詢和執行數據庫維護功能的 SQL 語句。一般情況下,Open 方法用于執行帶有結果集的查詢。
一般情況下,ExecSQL 方法用于執行沒有結果集返回的 SQL 語句。不過,Delphi 并沒有規定在哪種情況下一定要使用哪種方法,可以使用 Open 來執行所有的 SQL 語句。
ADOQuery 組件的動態 SQL 語句是指帶有參數的 SQL 語句,參數的值在運行過程中動態確定,在程序執行期間參數的值是可變的。如:
select * from customers where name = :NAME;
其中:“:NAME” 就是動態 SQL 的參數,運行時必須給定數據。
在 ADOQuery 組件中,該組件提供了 Parameters 屬性來為參數賦值。
設計期:
單擊 ADOQuery 組件的 Parameters 屬性右側的 ... 按鈕,如下圖所示:
在參數對話框中選擇某個參數名稱,在對象觀察器中可以設置該參數的屬性,包括參數類型、參數值等。
運行期:
在運行期,可以使用 Parameters 屬性,以數組的方式進行訪問和設置,也可以使用 ParamByName 方法獲取對應的參數并進行設置。如:
Param := ADOQuery.Parameters.ParamByName('AnId');
Param.DataType := ftInteger;
Param.Value := 1;
示例1:輸入姓名查詢數據
界面設計如下圖所示:
組件及屬性:
組件 | 屬性 | 值 |
Panel1 | Align | alTop |
Caption | '' | |
Label1 | Caption | '姓名' |
Edit1 | Text | '' |
Button1 | Caption | '查詢' |
ADOConnection1 | ConnectionString | Provider=MSDASQL.1;Persist Security Info=False;Data Source=demodb; |
LoginPrompt | False | |
Connected | True | |
ADOQuery1 | Connection | ADOConnection1 |
SQL | select * from d_students where name =:NAME | |
Active | False | |
DataSource1 | DataSet | ADOQuery1 |
DBGrid1 | Align | alClient |
DataSource | DataSource1 |
代碼示例:
procedure TForm1.Button1Click(Sender: TObject);
var
Param: TParameter;
begin
with ADOQuery1 do
begin
Close;
Param := Parameters.ParamByName('NAME');
Param.DataType := ftString;
Param.Value := Edit1.Text;
Prepared := True;
Open;
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
begin
ADOConnection1.LoginPrompt := False;
ADOConnection1.Open();
end;
示例2:輸入任意 SQL 語句執行
界面設計如下:
組件及屬性設置參照上例。
示例代碼: