delphi中使用游标处理数据
游标
1.使用存储过程调用游标读取数据
声明并打开游标后,执行FETCH语句可以读取数据。声明一个滚动游标,执行FETCH语句,则可以实现使用游标按指定行读取数据集中的数据。
例如,读取数据集中第一行数据。
SQL.Add('FETCH First FROM 游标名称')
例如,读取游标所在当前位置的上一行数据。
SQL.Add('FETCH prior FROM 游标名称')
例如,读取游标所在当前位置的下一行数据。
SQL.Add('FETCH Next FROM 游标名称')
例如,读取数据集中最后一行数据。
SQL.Add('FETCH Last FROM 游标名称')
例如,读取数据集中的任意一行数据。
SQL.Add('FETCH absolute 行数 FROM 游标名称');
下面利用本地临时存储过程(#PRO_YB)来创建一个游标,并通过调用临时存储过程对当前记录的首记录、尾记录和任意行记录进行读取操作。
操作步骤如下:
(1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TADODataSet、TDataSource、TButton、和TDBGrid等组件。
(2)主要程序代码如下:
用临时存储过程创建游标。
with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.Add('CREATE PROCEDURE #PRO_YB'); //创建本地临时存储过程
SQL.Add('@Int Integer,'); //自定义参数
SQL.Add('@Row Integer');
SQL.Add('AS');
SQL.Add('DECLARE ReadCursor scroll CURSOR FOR'); //创建游标
SQL.Add('select * from MR_student');
SQL.Add('OPEN ReadCursor'); //打开游标
SQL.Add('if @Int=1');
SQL.Add(' FETCH First FROM ReadCursor'); //首记录
SQL.Add('if @Int=2');
SQL.Add(' FETCH Last FROM ReadCursor'); //尾记录
SQL.Add('if @Int=3');
SQL.Add(' FETCH absolute @Row FROM ReadCursor'); //任意行的记录
SQL.Add('CLOSE ReadCursor'); //关闭游标
SQL.Add('DEALLOCATE ReadCursor'); //释放游标
EXECSQL;
end;
调用临时存储过程,并分别执行首记录、尾记录和读取任意行记录。
case Int of
1: begin //首记录
ADODataSet1.Active :=False;
ADODataSet1.CommandText := 'EXEC #PRO_YB 1,0';
ADODataSet1.Active :=True;
end;
2: begin //尾记录
ADODataSet1.Active :=False;
ADODataSet1.CommandText := 'EXEC #PRO_YB 2,0';
ADODataSet1.Active :=True;
end;
3: begin //任意行记录
if Edit1.Text<>'' then
begin
ADODataSet1.Active :=False;
ADODataSet1.CommandText := 'EXEC #PRO_YB 3,'+Edit1.Text;
ADODataSet1.Active :=True;
end
else
showmessage('请填写查询行数。');
end;
end;
2.使用游标添加和修改记录
使用游标添加和修改数据的操作步骤是一样的,首先要声明一个游标并打开该游标,然后用INSERT INTO语句和UPDATE SET语句对数据进行添加和修改,最后关闭并释放游标。在修改数据时,要用@@fetch_status函数判断要修改的数据是否存在,如果该函数返回为0,则修改该数据。
下面用游标添加和修改记录。
操作步骤如下:
(1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TMemo、TDataSource、TButton、和TDBGrid等组件。
(2)主要程序代码如下:
使用游标添加数据。
with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.Add('DECLARE UB_Insert CURSOR FOR'); //声明一个游标
SQL.Add('select * from MR_Table');
SQL.Add('OPEN UB_Insert'); //打开游标
//使用游标添加数据
SQL.Add('INSERT INTO MR_Table (id,name,sex,memo) VALUES ('''+Edit1.Text+''','''+Trim(Edit2.Text)+''','''+ Trim(Combobox1.Text)+''','''+memo1.Lines.Text+''')');
SQL.Add('CLOSE UB_Insert'); //关闭游标
SQL.Add('DEALLOCATE UB_Insert'); //释放游标
EXECSQL;
end;
使用游标修改数据。
with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.Add('DECLARE UB_Update CURSOR FOR'); //声明一个游标
SQL.Add('select * from MR_Table where id='+Edit3.Text);
SQL.Add('OPEN UB_Update'); //打开游标
SQL.Add('if @@FETCH_STATUS=0'); //用@@FETCH_STATUS判断当前是否有记录
SQL.Add('begin');
//使用游标修改数据
SQL.Add(' Update MR_Table SET name= '+Quotedstr(Trim(Edit4.Text))+ ',sex= '+Quotedstr(Trim(Combobox2.Text))+ ' where id='+Edit3.Text);
SQL.Add('end');
SQL.Add('CLOSE UB_Update'); //关闭游标
SQL.Add('DEALLOCATE UB_Update'); //释放游标
EXECSQL;
end;
3.使用游标删除指定记录
声明一个SQL Server数据库游标,打开游标,然后读取游标所在当前行,使用游标函数@@fetch_status判断游标的当前状态,如果游标读取数据成功,@@fetch_status函数将返回数值0,然后使用DELETE语句删除指定行的记录。
下面使用游标删除符合条件的记录行。
操作步骤如下:
(1)运行Delphi,在窗体中添加TADOConnection、TADOQuery、TComboBox、TDataSource、TButton、和TDBGrid等组件。
(2)主要程序代码如下:
with ADOQuery1 do
begin
close;
SQL.Clear;
SQL.Add('DECLARE UB_delete CURSOR FOR'); //声明一个游标
SQL.Add('select * from '+Combobox1.Text+' where '+Combobox2.Text+Combobox3.Text+''''+Edit1.Text+'''');
SQL.Add('OPEN UB_delete'); //打开游标
SQL.Add('FETCH UB_delete'); //执行取数操作
SQL.Add('if @@FETCH_STATUS=0'); //用@@FETCH_STATUS判断当前是否有记录
SQL.Add('begin');
SQL.Add(' delete from '+Combobox1.Text+' where '+Combobox2.Text+Combobox3.Text+''''+Edit1.Text+'''');
SQL.Add('end');
SQL.Add('CLOSE UB_delete'); //关闭游标
SQL.Add('DEALLOCATE UB_delete'); //释放游标
EXECSQL;
end;