Delphi使用TADOQuery的RowsAffected属性时需要注意的一个点
测试环境是:Delphi 6、Oracle、PLSQL
先创建一个模拟测试的数据表,并且添加几条模拟的数据
create table practice(uno varchar(8), uname varchar(20));
insert into practice values ('1', '1');
insert into practice values ('1', '1');
insert into practice values ('2', '2');
insert into practice values ('1', '1');
commit;
本文使用TADOConnection、TADOQuery并不是以拖动控件、配置控件属性的方式,而是直接通过写代码,如果想看使用控件的例子,可以参见:Delphi使用ADO进行数据库编程
使用ADOQuery执行SQL的之后,可以通过RowsAffected属性获取该SQL影响了数据表中的几行数据,但是根据拼接的SQL的形式的不同可能会有不同的效果,如果不注意则会可能在需要使用RowsAffected的时候出现问题,下面通过代码来展示一下,有两个按钮,展示两种SQL形式的不同效果.
代码逻辑和运行效果会在程序中解释,包括
- 数据库连接串
- ADOQuery和ADOConnection的使用
- 不同方式拼接的SQL导致最后RowsAffected的值的效果
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, DB, ADODB, StdCtrls;
type
TForm1 = class(TForm)
btn1: TButton;
btn2: TButton;
procedure btn1Click(Sender: TObject);
procedure btn2Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
procedure TForm1.btn1Click(Sender: TObject);
var
adoConnection: TAdoConnection;
adoQuery: TAdoQuery;
sql: string;
count: Integer;
begin
adoConnection:= TAdoConnection.Create(nil);
adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=TestSource' ;
adoConnection.Open('testUser', 'testPassword'); //第一个参数是用户名,第二个参数是密码
//或者可以将用户名密码的信息放到数据库连接串,然后直接调用adoConnection.Open;而不是adoConnection.Open('testUser', 'testPassword');
//adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource' ;
//adoConnection.Open;
adoQuery:= TADOQuery.Create(nil);
adoQuery.Connection := adoConnection;
//这种方式拼接的SQL最后执行之后获取的RowsAffected是真正被更新的行数
sql:= 'UPDATE practice SET uname = ''test'' where uno = ''1'' '; //这种时候SQL的结尾不要有 ;
adoquery.SQL.Text:= sql;
{如果在PLSQL中执行上面的SQL,那么需要添加Commit才能真正修改
但是在代码中使用这样的SQL,并且通过adoQuery.ExecSQL;方式执行SQL,其实不需要在拼接的SQL中显式添加Commit的,会自动提交的
}
//使用这种方式拼接的SQL,执行之后获取的RowsAffected总是1
sql:= 'UPDATE practice SET uname = ''test'' where uno = ''10''; '; //这种时候SQL的结尾必须要有 ;
adoquery.SQL.Text:= 'Begin ' + sql + ' Commit; End;';
count:= adoQuery.ExecSQL; //执行adoQuery.ExecSQL的返回值其实就是等于adoQuery.RowsAffected的值
//ShowMessage('修改了' + IntToStr(count) + ' 条记录');
ShowMessage('修改了' + IntToStr(adoQuery.RowsAffected) + ' 条记录');
//使用上面制造的那样的模拟数据,这里的弹出显示: 修改了3条记录
adoQuery.Free;
adoConnection.Free;
end;
procedure TForm1.btn2Click(Sender: TObject);
var
adoConnection: TAdoConnection;
adoQuery: TAdoQuery;
sql: string;
count: Integer;
begin
adoConnection:= TAdoConnection.Create(nil);
adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;Data Source=TestSource' ;
adoConnection.Open('testUser', 'testPassword'); //第一个参数是用户名,第二个参数是密码
//或者可以将用户名密码的信息放到数据库连接串,然后直接调用adoConnection.Open;而不是adoConnection.Open('testUser', 'testPassword');
//adoConnection.ConnectionString := 'Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource' ;
//adoConnection.Open;
adoQuery:= TADOQuery.Create(nil);
adoQuery.Connection := adoConnection;
//使用这种方式拼接的SQL(在原有的SQL中加了commit;),执行之后获取的RowsAffected总是1
//就算其没有更新任何一行,最后RowsAffected值会是1,就算其更新了10行,最后RowsAffected的值还是1
sql:= 'UPDATE practice SET uname = ''test'' where uno = ''10''; '; //这种时候SQL的结尾必须要有 ;
adoquery.SQL.Text:= 'Begin ' + sql + ' Commit; End;';
count:= adoQuery.ExecSQL; //执行adoQuery.ExecSQL的返回值其实就是等于adoQuery.RowsAffected的值
//ShowMessage('修改了' + IntToStr(count) + ' 条记录');
ShowMessage('修改了' + IntToStr(adoQuery.RowsAffected) + ' 条记录');
//使用上面制造的那样的模拟数据,这里的弹出显示: 修改了1条记录
adoQuery.Free;
adoConnection.Free;
end;
end.
补充说明一下数据库连接串
数据库连接串 adoConnection.ConnectionString := ‘Provider=OraOLEDB.Oracle.1;Persist Security Info=False;User ID=testUser;Password=testPassword;Data Source=TestSource’ ;
- Provider:数据库驱动
- Persist Security Info:
- User ID:数据库用户
- Password:数据库用户对应的密码
- Data Source:数据源,数据源的解释可以看下面的数据库相关的配置文件
补充:tnsnames.ora文件
我们在Oracle客户端配置连接Oracle的信息的时候,其实最后配置的连接信息是保存到tnsnames.ora这个配置文件中的
在tnsnames.ora中配置的数据库连接信息,也就是数据源等信息,可以配置多个,下面只以一个来作为例子展示
#TestSource就是数据源的名称,和数据库连接串中的Data Source=TestSource 相对应
TestSource =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.88.79)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = orcl)
)
)
Delphi使用TADOQuery的RowsAffected属性时需要注意的一个点的更多相关文章
- Delphi中TStringList类常用属性方法详解
TStrings是一个抽象类,在实际开发中,是除了基本类型外,应用得最多的. 常规的用法大家都知道,现在来讨论它的一些高级的用法. 先把要讨论的几个属性列出来: 1.CommaText 2.Delim ...
- delphi 中Adoquery ,在打开时能否让记录指针不移动? [问题点数:40分,结帖人microd]
delphi 中Adoquery ,在打开时能否让记录指针不移动?由于数据集Adoquery 时,它的针指称动会废时,能否在打开完成之前不让记录指针不移动.打开完毕之后再回复移动? 这样用:self. ...
- 数据库表中存在Text类型的属性时,写sql语句时需要注意喽!
之前,习惯性地写查询语句时,查询条件用“=”判断.今天写程序的时候,查询时突然报了一个错误:数据类型text 和varchar 在equal to 运算符中不兼容.查看了一下数据库发现,其中有一个属性 ...
- block作为类的属性时用copy
1. block作为类的属性时用copy Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的 <栈 :由系统维护的局 ...
- zepto在操作dom的selected和checked属性时尽量使用prop方法
zepto在操作dom的selected和checked属性时尽量使用prop方法.
- delphi RTTI 四 获取类属性列表
delphi RTTI 四 获取类属性列表 GetPropList(btn1.ClassInfo, tkAny, PropList) PropCount := GetTypeData(btn1.Cla ...
- delphi XE7 在Android编译SharedActivity时出错
delphi XE6 在Android编译SharedActivity时正常,但xe7下编译出错,在uses添加Androidapi.Helpers就可以.
- html5 video使用autoplay属性时,声音混乱
html5 video使用autoplay属性时,声音混乱 页面代码 Index.html <html xmlns="http://www.w3.org/1999/xhtml" ...
- Delphi+MySQL:TADOQuery使用插入中文乱码解决方法
Delphi+MySQL:TADOQuery使用插入中文乱码解决方法 with adoquery dobeginclose;sql.clear;sql.text:=' insert into test ...
随机推荐
- kotlin字符串比较&空值处理&when表达式
字符串比较: 字符串的比较也是实际中比较常见的,下面来看下它的比较跟java中有啥不同,下面走起! 如我们所预期,其结果: 下面再来: 如果是java,结果肯定是为false,因为"==&q ...
- 浅谈矩阵变换——Matrix
矩阵变换在图形学上经常用到.基本的常用矩阵变换操作包括平移.缩放.旋转.斜切. 每种变换都对应一个变换矩阵,通过矩阵乘法,可以把多个变换矩阵相乘得到复合变换矩阵. 矩阵乘法不支持交换律,因此不同的变换 ...
- django nginx uwsgi 502 Gateway
前提:腾讯云服务器有个内网ip和外网ip 首先检查使用的端口是否正常可用 1.检查端口是否开放,在腾讯云控制台安全组查看 2.检查防火墙端口是否开放 systemctl start firewalld ...
- mybatis注解大全
注解 目标 相对应的 XML 描述 @CacheNamespace 类 <cache> 为给定的命名空间 (比如类) 配置缓存. 属性:implemetation,eviction, fl ...
- ibatis调用存储过程(无返回参数)
ibatis调用存储过程例子: java: getSqlMapClientTemplate().insert(sql, paraMap) ibatis xml: <parameterMap id ...
- JS 中获取服务器时间的注意点
在通过js获取服务器时间时,遇到了小小的问题,但造成的影响挺大的,所以写出来提醒大家,在获取服务器时间时一定要细心要多测试多验证. js 中使用以下方法获取服务器时间时要注意两点: 1.xhr.ope ...
- (六)绘图,文本编程,定时器,菜单,图标icon,消息类型
1,简单绘图 画直线 a,鼠标按下和抬起 void CDrawView::OnLButtonDown(UINT nFlags, CPoint point) { // TODO: 在此添加消息处理程序代 ...
- hdu 5834 Magic boy Bi Luo with his excited tree 树形dp+转移
Magic boy Bi Luo with his excited tree Time Limit: 8000/4000 MS (Java/Others) Memory Limit: 13107 ...
- 洛谷P4698 [CEOI2011]Hotel [贪心,二分,并查集]
题目传送门 Hotel 题目描述 你经营着一家旅馆,这家旅馆有 n 个房间,每个房间有维护费用和容量.其中第 i 个房间的维护费用为 ci,容量为 pi 人. 现在有 m 个订单,每个订单有两个参 ...
- JQuery动画之滑入滑出动画
1. 滑入动画(类似于商店的卷帘门) $(selector).slideDown(speed, 回调函数); 解释: 此语句实现的功能为, 在XX时间内, 下拉动画, 显现元素. 当 slideDow ...