資料庫端準備
USE pubs;
IF EXISTS (SELECT * FROM sysobjects WHERE id = OBJECT_ID('[dbo].[test]') AND OBJECTPROPERTY(id,'IsUserTable')=1)
DROP TABLE [dbo].[test];
GO
CREATE TABLE [dbo].[test] (
[id] CHAR(10) COLLATE Chinese_PRC_CI_AS NOT NULL,
[name] CHAR(12) COLLATE Chinese_PRC_CI_AS NULL,
[descrip] CHAR(30) COLLATE Chinese_PRC_CI_AS NULL
) ON [PRIMARY];
GO
CREATE PROCEDURE myInsert
@id CHAR(10), @name VARCHAR(12), @descrip VARCHAR(30)
AS
BEGIN
INSERT INTO test (id,name,descrip) VALUES (@id,@name,@descrip);
IF @@ROWCOUNT = 0
BEGIN
RAISERROR('Insert failed',16,1);
ROLLBACK TRANSACTION;
END
END
GO
Delphi 專案配置
| 元件 | 關鍵屬性 |
| ADOConnection1 | LoginPrompt=False; ConnectionString=Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initial Catalog=pubs;Data Source=(local) |
| ADOStoredProc1 | Connection=ADOConnection1; ProcedureName=myInsert |
| ADOTable1 | Connection=ADOConnection1; TableName=test |
| DataSource1 | DataSet=ADOTable1 |
| DBGrid1 | DataSource=DataSource1 |
按鈕 Click 事件
procedure TForm1.Button1Click(Sender: TObject);
begin
with ADOStoredProc1 do
begin
Parameters.ParamByName('@id').Value := '2';
Parameters.ParamByName('@name').Value := 'myname';
Parameters.ParamByName('@descrip').Value := 'nosubject';
ExecProc;
end;
ADOTable1.Close;
ADOTable1.Open; // 重新整理 DBGrid
end;
重點提示
- 預存程序參數名稱需與資料庫定義完全一致(含 @ 符號)。
ExecProc 執行無結果集的預存程序;若有結果集請用 Open。
- 交易控制建議在預存程序內完成(如範例
ROLLBACK),Delphi 端僅負責呼叫。