测试环境是: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 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)
)
)