⑴ Delphi與SQL Server存儲過程編程詳解
前言 經常有很多初學者問到在delphi中如何調用SQL Server的存儲過程?問題其實很好解帆譽宴決 但問得多了 也就不願答了 下面我將用實例進行說明 從在SQL Server中創建存儲過程到調用的完整實例 首先 打開sql server管理器 在pubs資料庫中建一個測試表 表名為test 欄位有id name 和desc 全部為字元型 如果你不知道建表 那麼打開sql查詢分析器 貼上以下的代碼 然後按執行 就會自動生成test表 use pubsif exists (select * from dbo sysobjects where id = object_id(N [dbo] [test] ) and OBJECTPROPERTY(id N IsUserTable ) = )態銀drop table [dbo] [test]GOCREATE TABLE [dbo] [test] ([id] [char] ( ) COLLATE Chinese_PRC_CI_AS NOT NULL [name] [char] ( ) COLLATE Chinese_PRC_CI_AS NULL [descrip] [char] ( ) COLLATE Chinese_PRC_CI_AS NULL) ON [PRIMARY]GO然後 我們來創建一個存儲過程 其功能為在test中插入一條新記錄 創建存儲過程的代碼如下 同樣的 你也可以復制到查詢分析器里直接執虛裂行就可以:CREATE PROCEDURE myInsert@id char( ) @name varchar( ) @descrip varchar( )ASbegininsert into test (id name descrip) values (@id @name @descrip)if @@rowcount= beginraiserror( error )rollback transactionendendGO接下來 新建一個工程文件 在form 上放置如下控制項 並設置屬性(括弧內):一個ADOConnection : TADOConnection;(LoginPrompt:=false;connectionstring:=Provider=SQLOLEDB ;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=(local);)一個ADOStoredProc : TADOStoredProc;屬性為:(connection:=adoconnection ;procerename:=myinsert;//上面我們創建的那個)一個ADOTable : TADOTable;屬性為:(connection:=adoconnection ;tablename:=test;//上面我們創建的那個)一個Datasource 屬性為:(dataset:=Tadotable;)一個 DBGrid : TDBGrid;屬性為(datasource:=datasource ;)一個Button 在其Onclick中寫到:with adoStoredproc dobeginParameters ParamByName( @id ) Value := ;parameters ParamByName( @name ) Value := myname ;parameters ParamByName( @descrip ) Value := nosubject ;ExecProc;end;Adotable Close;adotable Open; lishixin/Article/program/SQLServer/201311/21984
⑵ DELPHI基礎教程:SQL編程(一)[4]
利用參數編輯器(Parameter Editor)來為參數賦值
具體方法是 選中TQuery部件 單擊滑鼠右鍵 然後從中選擇Define Parameters 便可以打開參數編輯器
例如 在TQuery部件的SQL屬性中我們設置如下的SQL語句
Setect * From Customer Where CustNO=:Number;
TQuery的DatabaseName屬性為DBDEMOS 其中Number為參數變數 我們便可以為參數Number賦值 在Datetype組合框中選擇該參數的數據類型為整數Integer 在Value編輯框中可以為參數Number賦一個值 也可以單擊Null Value檢查框為參數Number賦一個空值Null 給參數賦值之後 單擊OK按鈕 這樣TQuery部件中的SQL 查詢便准備好了 而且參數值也被賦給了動態SQL語句中相應的參數 此時當把TQuery 部件的Active屬性設置成True時 在與TQuery部件相連的數據瀏覽部件中會顯示出查詢結果 通過參數編輯器為參數賦值 這種方式缺乏應有的靈活性 在實際應用中用得較少 在實際應用中程序設計人員希望用更靈活方便的方式為參數賦值 那就是我們接下來要介紹的另一種途徑
在運行過程中 通過程序為參數賦值
用這種方式為參數賦值有三種方法
①根據參數在SQL語句中出現的順序 設置TQuery部件的Params屬性值為參數賦值
②直接根據SQL語句中各參數的名字 調用ParamByName方法來為各參數賦值
③將TQuery部仔銀遲件的DataSource屬性設置為另一個數據源 這樣將另一個數據源中與當前TQuery部件的SQL語句中的參數名相匹配的欄位值賦給其對應的參數
這三種方法我們將在下面的三小節中具體地介紹
使用Params屬性為參數賦值
TQuery部件具有一個Params屬性 它們在設計時不可用 在程序運行過程中可用 並且是動態建立的 當為TQuery部件編寫動態SQL 語句時 Delphi 會自動地建立一個數組Params 數組Params是以 下標開始的 依次對應動態SQL 語句中的參數 也就是說動態SQL語句中第一個參數對應Params[ ] 第二個參數對應params[ ] 依此類推
例如 一個TQuery部件Query 我們為它編寫的動態SQL語句是
Insert Into Customer(CustNo Name Country)
Values(念李 CustNo :Name : Country)
對於上述這條動態SQL語句中的參數 我們可以利用TQuery部件的params 屬性為參數賦值
Query params[ ] AsString := ;
Query params[ ] AsString := Lichtenstein ;
Query params[ ] AsString := USA ;
上述語句將把 賦給參數 Cuse_No Lichtenstein 賦給參數 Name USA 賦給參數 Country
使用ParamByName方法為參數賦值
ParamByName是一個函數 用動態SQL語句中的參數作為調用ParamByName函數的參數 這樣便可以為它們賦值 使用這種賦值方法 必須要知道動態SQL語句參數的名字
例如在 節中的例子中 也可以用下述方法給參數賦值
Query ParamByName( CustNo ) AsString := ;
Query ParamByName( Name ) AsString := Lichtenstein ;
Query ParamByName( Country ) AsString := USA ;
使用這種方法同樣可以為各參數賦值 而且更加直觀一些
使用Datasource屬性為參數賦值
上述兩種方法的共同特點是 我們在為各參數賦值時 我們是知道各參數對應的具體參數值的 而在具體的應用程序中 有些參數值常常是無法確定的 例如參數值來自於另搏宴一個查詢結果 對於這種情況 Delphi提供了使用Datasource屬性為動態SQL 語句中尚存在沒有賦值的參數時 Delphi 會自動檢查 TQuery 部件的 Datasource 屬性 如果為Datasource屬性設置了屬性值(該屬性的值是另一個TDatasource部件的名字) Delphi 會把沒有賦值的參數與TDatasource部件中的各欄位比較 Delphi 會將相應的欄位值賦給與其相匹配的參數 利用這種方法也能實現所謂的連接查詢 我們在學習使用TTable部件時 便會創建主要 明細型資料庫應用 用TQuery部件創建的連接查詢與主要 明細型應用是相似的
例如 在如圖 所示的應用中 設置了下列部件
● 一個TTable部件
名字為Cust 它的DatabaseName屬性為DEMOS TableName屬性為Customer
● 一個TDatasource部件
名字為Custsource 其Dataset屬性被設置為Cust
● 一個TQuery部件
名字為ORDERS 其DatabaseName被設置為DEMOS SQL屬性值為
Select Orders CustNo Orders OrderNo Orders SaleDate FROM Orders
WHERE Orders CustNo =: CustNo
ORDERS的DataSouce屬性被設置為CustSource
● 一個TDatasource部件
名字為OrderSource 其DataSet屬性被設置為Orders
● 兩個TDBGrid部件
它們分別連接CustSource和OrderSource
TQuery部件Orders中的動態SQL語句中的參數 CustNo在程序設計過程中沒有給它賦值 當該應用程序運行時Delphi會自動地到其Datasource屬性中說明的數據源CustSource中查找與參數 CustNo匹配的欄位 而CustSource中正好有一個名字為 CustNo 的欄位與參數 CustNo匹配 這樣Customer表中的CustNo欄位值被賦給了參數 : CustNo 而當每移動Customer表中的記錄指針 參數 CustNo的值會隨之改變 而參數 CustNo的值發生改變時 Orders中的動態SQL語句會根據新的參數值重新查詢 從資料庫表中獲取相應的訂單數據 這樣也變實現了類似於主要 明細型應用 即連接查詢
Prepare方法的使用
在使用動態SQL語句編程時 常常用到一個很重要的方法prepare 調用prepare 方法之後 Delphi會將帶參數的SQL語句傳送給與其對應的資料庫引擎 對動態SQL語句進行語法分析和優化 雖然在用動態SQL語句編程時 調用prepare方法並不是必須的 但是這里我們要極力推薦調用prepare方法 因為調用prepare方法後 會大大提高動態SQL 語句的執行性能 特別是當要反復多次執行同一條動態SQL語句時 其優越性會更加明顯 如果在應用程序中執行一條SQL語句之前並沒有顯式地調用prepare方法 每次在執行SQL 語句時 Delphi會隱含地調用propare方法以准備這個查詢
TQuery部件還有一個prepare屬性 這是一個布爾型屬性 當其屬性值為True時 表明該查詢已被准備好了( SQL 語句已被傳送到資料庫引擎中 ) 當我們使用參數編輯器Parameters Editor來為動態SQL語句中的參數賦值時 當設置完相應的參數值並退出參數編輯器時 Delphi會隱含地調用prepare方法以准備好查詢
當SQL語句執行完之後 要想准備下一個查詢 首先必須調用close方法 然後才能調用prepare方法准備下一個查詢 一般來說 在一個應用程序中應該調用一次prepare方法 常常在窗體的OnCreate事件處理過程中調用prepare方法 然後用上述介紹的方法為參數賦值 最後調用Open方法或ExecSQL方法執行SQL語句 以完成查詢
當然在調用prepare方法准備好一個查詢時 會消耗一些資料庫資源 因而每當一個查詢執行完畢之後 要養成調用Unprepare方法以撤消查詢的好習慣 在運行程序過程中 通過程序改變TQuery部件的SQL屬性值時 Delphi會自動地調用Close方法和Unprepare 方法 以撤消查詢
返回目錄 DELPHI基礎教程
編輯推薦
Java程序設計培訓視頻教程
J EE高級框架實戰培訓視頻教程
Visual C++音頻/視頻技術開發與實戰
Oracle索引技術
ORACLE G資料庫開發優化指南
Java程序性能優化 讓你的Java程序更快 更穩定
C嵌入式編程設計模式
Android游戲開發實踐指南
lishixin/Article/program/Delphi/201311/25147
⑶ DELPHI基礎教程:SQL編程(一)[2]
靜態方式是把SQL命令文作為TQuery部件的SQL屬性值進行設置 這樣 當執行應用程序時 Delphi便執行TQuery部件SQL屬性中設置的SQL命令 如果是SQL中的查詢命令 把TQuery部件通過TDataSource部件與數據控制部件相連 查詢的結果將會顯示在與 TQuery部件相連接的數據瀏覽部件中 動態SQL語句是指SQL語句中包含一些參數變數 在程序中可以為這些參數賦值 在程序運行過程中 各個參數值是變化的 TQuery部件的SQL 屬性中的SQL語句的編寫也有兩種方法 一種方法是在程序設置階段便將相應的SQL語句寫入到TQuery的SQL屬性中 另一種方法是在Delphi開發的應用程序將SQL語差敏句 包含在Pascal代碼單元中
在SQL編程中使用TQuery部件的具體方法步驟如下
①為TQuery部件設置DatabaseName屬性 它可以是用BDE建立的資料庫的別名 或桌面資料庫系統中的目錄名或資料庫伺服器中的文件名 如果在應用中使用了TDatabase 部件 那麼TQuery部件的DatabaseName屬性可以是TDatabase部件中定義的一個資料庫別名 詳細情況請參看 TDatabase部件的使用 ;
②為TQuery部件設置SQL屬性 TQuery部件的SQL屬性值就是應用程序要執行的SQL 命令文本 設置SQL屬性有兩種方法
● 在程序設計過程中 我們可以通過對象瀏覽器(Object Inspector)編輯SQL屬性在Object Inspector中選擇SQL屬性 這樣會打開String List Editor窗口 在其中我們便可以編寫SQL命令 我還可以打開Visual Query Builder來編寫SQL命令 (只有Delphi的客戶/伺服器版本才具有這一工具)
● 將SQL命令包含在Pascal代碼單元中
旦則在程序運行過程中 首先調用TQuery部件的Close方法關閉當前的TQuery部件 然後調用Clear方法清除SQL屬性 並說明新的SQL命令文本 然後調用Add方法 將新的SQL命令文本加入到SQL屬性中
③通過調用TQuery部件的Open方法或ExecSQl方法執行 SQL 命令 Open 方法只執行Select命令 ExecSQL方法還可以執行其它的SQL命令 Open方法和ExecSQL 方法的區別我們在後面的章節里會進一步地加以討論的
如果使用動態SQL語句 首先調用prepare方法 給動態SQL語句中的參數賦值 然後再調用Open方法或ExecSQL方法 調用propare 方法並不是必須的 但是對於要多次執行TQuery部件中SQL屬性中的動態SQL語句 調用Prepare可以大大提高TQuery部件執行SQL語句的性能
在TQuery部虛遲枝件中編寫簡單的SQL查詢命令
在這一節里我們將學習如何使用TQuery部件編寫簡單的SQL查詢命令 並在Delphi 應用程序中實現SQL查詢
例如 如果我們想查詢出表Customer DB中客戶的編號和公司名稱 我們按下列步驟來實現
①在應用窗體中放置一個TQuery部件 一個TDataSource部件一個TDataGrid部件 並將它們連接起來
②設置窗體TQuery 部件Query 的DatabaseName屬性值為DBDEMOS
③雙擊Object Inspector窗口中Query 的SQL 屬性 Delphi 將顯示 String List Editor窗口
④在圖 中的窗口中輸入SQL語句
Select CustNo Company From Custormer;
⑤單擊OK按鈕 關閉String List Editor窗口
⑥設置Query的Open屬性為True
SQL語言編程概述
在Delphi應用程序中的SQL命令語句是包含在TQuery部件的SQL屬性中 TQuery部件的SQL屬性是TString類型的 也就是說SQL屬性值是一個字元串列表 這個字元串列表非常類似於一個字元串類型的數組 有關TString類型的信息請參看聯機幫助 在前一節里我們介紹了TQuery部件可以執行兩種SQL語句
● 靜態SQL語句
● 動態SQL語句
靜態SQL語句在程序設計時便已固定下來 它不包含任何參數和變數 例如下面的語句便是一條靜態SQL語句
Select * From Cusromer Where CustNo = ;
而動態SQL語句 也被稱作參數化的語句 在其中間包含著表示欄位名或表名的參數 例如下面的語句是一條動態SQL語句
Select * From Customer Where CustNo =: Number;
其中的變數Number便是一個參數變數 它由一個冒號引導 在程序運行過程中 必須要為該參數賦值 該條SQL語句才能正確執行 每次運行應用程序時可以為該參數變數賦予不同的值
SQL命令文本的編寫
使用String List Editor編寫
我們要為TQuery部件的SQL屬性設置SQL命令文本時 可以在應用窗體中選擇TQuery部件且雙擊Object Inspector窗口中的SQL屬性 這樣便打開了String List Editor 窗口 在該窗口中我們便可以編寫各種SQL命令 如圖 所示
在編寫完適當的SQL語句之後 選擇 OK 按鈕便可以將編輯器中的 SQL 命令文裝入到TQuery部件的SQL屬性中 選擇SAVE按鈕可以將編寫好的SQL命令保存到一個文件中供以後編程時使用 我們在編寫SQL命令文本時還可以選擇Load按鈕從一個 SQL 命令文件中調入SQL命令 在程序運行過程中 要想設置TQuery部件的SQL屬性 必須首先調用Close方法 關閉TQuery部件 然後再調用Clear方法清除SQL屬性中現存的SQL命令語句 最後再調用Add方法為SQL屬性設置新的SQL命令語句 例如
Query Close {關閉Query )
Query SQL Clear {清除SQL屬性中的SQL命令語句}
Query SQL Add( Select * From Country )
Query SQL Add( Where Name = ARGENTINA )
在為TQuery部件設置SQL屬性時調用Close方法總是很安全的 如果TQuery部件已經被關閉了 調用Close方法時不會產生任何影響 在應用程序中為SQL屬性設置新的SQL 命令語句時 必須要調用Clear方法以清除SQL屬性中現存的SQL命令語句 如果不調用Clear方法 便調用Add方法向SQL屬性中設置SQL命令語句 那麼新設置的SQL命令語句會追加在現存SQL命令語句後面 在程序運行時常常會出現出乎意料的查詢結果甚至程序無法運行下去
在這里要特別注意的 一般情況下TQuery部件的SQL屬性只能包含一條完整的SQL語句 它不允許被設置成多條SQL語句 當然有些資料庫伺服器也支持在TQuery部件的SQL屬性中設置多條SQL語句 只要資料庫伺服器允許這樣 我們在編程時可以為 SQL 屬性設置多條SQL語句
lishixin/Article/program/Delphi/201311/25145
⑷ delphi中寫SQL語句
sSQL:='Insert into goods(Qname,QPrice,QLuJin,QQiDing,QYuanJia,QMemo,QTime) values ('''
+sQname+''',''神悄'+sQPrice+''','''
+'QuPic\游凳渣'+edt1.Text+'.jpg'+''','''
+EDT4.Text+'粗陵'','''+Edt5.Text+''','''
+mmo1.Text+''','''+sQTime+''')';
qry1.SQL.add(sSQL);
qry1.ExecSQL;
qry1.Close;
⑸ DELPHI基礎教程:SQL編程(二)[2]
TabSheet : TTabSheet;
Label : TLabel;
Label : TLabel;
Label : TLabel;
Label : TLabel;
Label : TLabel;
ListBox : TListBox;
ListBox : TListBox;
ListBox : TListBox;
唯緩Edit : TEdit;
猜頃ComboBox : TComboBox;
BitBtn : TBitBtn;
TabSheet : TTabSheet;
Memo : TMemo;
procere FormCreate(Sender: TObject)
procere ListBox Click(Sender: TObject)
procere ListBox Click(Sender: TObject)
procere BitBtn Click(Sender: TObject)
end;
var
QueryForm: TQueryForm;
implementation
{$R * DFM}
指兆模uses RSLTFORM;
procere TQueryForm FormCreate(Sender: TObject)
begin
Screen Cursor := crHourglass;
{ Populate the alias list }
with ListBox do
begin
Items Clear;
Session GetAliasNames(Items)
end;
{ Make sure there are aliases defined }
Screen Cursor := crDefault;
if ListBox Items Count < then
MessageDlg( There are no database aliases currently defined You
need at least one alias to use this demonstration
mtError [mbOK] )
{ Default the drop down list to the first value in the list }
ComboBox ItemIndex := ;
end;
procere TQueryForm ListBox Click(Sender: TObject)
var
strValue: string; { Holds the alias selected by the user }
bIsLocal: Boolean; { Indicates whether or not an alias is local }
slParams: TStringList; { Holds the parameters of the selected alias }
iCounter: Integer; { An integer counter variable for loops}
begin
{ Determine the alias name selected by the user }
with ListBox do
strValue := Items Strings[ItemIndex];
{ Get the names of the tables in the alias and put them in the
appropriate list box making sure the user s choices are reflected
in the list }
ListBox Items Clear;
Session GetTableNames(strValue { alias to enumerate }
{ pattern to match }
CheckBox Checked { show extensions flag }
CheckBox Checked { show system tables flag }
ListBox Items) { target for table list }
{ Make sure there are tables defined in the alias If not show an
error; otherwise clear the list box }
Screen Cursor := crDefault;
if ListBox Items Count < then
MessageDlg( There are no tables in the alias you selected Please
choose another mtError [mbOK] )
ListBox Items Clear;
end;
procere TQueryForm ListBox Click(Sender: TObject)
begin
Screen Cursor := crHourglass;
try
{ First disable the TTable object }
if Table Active then
Table Close;
{ Open the selected table }
with ListBox do
Table DatabaseName := Items Strings[ItemIndex];
with ListBox do
Table TableName := Items Strings[ItemIndex];
{ Open the table and put a list of the field names in the Fields
list box }
lishixin/Article/program/Delphi/201311/25141