网络数据库讲稿客户端开发编程讲稿.docx
《网络数据库讲稿客户端开发编程讲稿.docx》由会员分享,可在线阅读,更多相关《网络数据库讲稿客户端开发编程讲稿.docx(12页珍藏版)》请在冰豆网上搜索。
网络数据库讲稿客户端开发编程讲稿
SQLServer客户端开发与编程
一、引言
1.编程模式:
C/S模式和B/S模式。
2.客户端编程语言:
ASP,VB,VC,VFP,PB,Delphi,Access,ASP,JSP等,都可访问SQL数据库。
3.可访问多种数据库。
二、数据库编程接口
1.ODBC
ODBC(OpenDatabaseConnectivity,开放数据库互连)是微软公司开放服务结构(WOSA,WindowsOpenServicesArchitecture)中有关数据库的一个组成部分,它建立了一组规范,并提供了一组对数据库访问的标准API(应用程序编程接口)。
这些API利用SQL来完成其大部分任务。
ODBC本身也提供了对SQL语言的支持,用户可以直接将SQL语句送给ODBC。
一个基于ODBC的应用程序对数据库的操作不依赖任何DBMS,不直接与DBMS打交道,所有的数据库操作由ODBC驱动程序完成。
也就是说,不论是FoxPro、Access,MYSQL还是Oracle数据库,均可用ODBCAPI进行访问。
由此可见,ODBC的最大优点是能以统一的方式处理所有的数据库。
2.OLEDB
OLEDB(ObjectLinkingandEmbedding,对象连接与嵌入),简称OLE技术;DB(database)。
OLEDB(OLEDB)是微软的战略性的通向不同的数据源的低级应用程序接口。
OLEDB不仅包括ODBC的结构化查询语言(SQL)能力,还具有面向其他非SQL数据类型的通路。
作为微软的组件对象模型(COM)的一种设计,OLEDB是一组读写数据的方法。
3.ADO
ADO(ActiveXDataObjects)是微软公司的一个用于存取数据源的COM组件。
它提供了编程语言和统一数据访问方式OLEDB的一个桥梁。
允许开发人员编写访问数据的代码而不用关心数据库是如何实现的,而只用关心到数据库的连接。
ADO是一种面向对象的编程接口,是一个能够访问不同数据库的统一接口,它在OLEDB中提供了一种“桥”程序,这种程序能够提供对数据库的连接。
开发人员在使用ADO时,其实就是在使用OLEDB,不过OLEDB更加接近底层。
4.三种接口之间的关系
ODBC是Microsoft引进的一种早期数据库接口技术。
它实际上是ADO的前身。
早期的数据库连接是非常困难的,每个数据库的格式都不一样,开发者得对他们所开发的每种数据库的底层API有深刻的了解,因此,能处理各种各样数据库的通用的API就应运而生了,也就是现在的ODBC(OpenDatabaseConnectivity)。
ODBC是人们在创建通用API的早期产物,有许多种数据库遵从了这种标准,被称为ODBC兼容的数据库。
OLEDB位于ODBC层与应用程序之间。
如果想使用一个ODBC数据源,OLEDB可使用相应的ODBC驱动程序。
如果不需要使用ODBC数据源,那么可以使用相应的OLEDB提供者,这些通常称为本地提供者(nativeprovider)。
使用ODBC提供者意味着需要一个额外的层。
因此,当访问相同的数据时,针对ODBC的OLEDB提供者可能会比本地的OLEDB提供者的速度慢一些。
在一些应用中,例如ASP、Delphi,ADO是位于OLEDB之上的“应用程序”。
ADO调用先被送到OLEDB,然后再交由ODBC处理。
附:
1.用odbc连接数据库:
odbc中提供三种dsn,它们的区别很简单:
用户dsn只能用于本用户。
系统dsn和文件dsn的区别只在于连接信息的存放位置不同:
系统dsn存放在odbc储存区里,而文件dsn则放在一个文本文件中。
在asp中使用它们时,写法如下:
(1)sqlserver:
用系统dsn:
connstr="DSN=dsnname;UID=xx;PWD=xxx;DATABASE=dbname"
用文件dsn:
connstr="FILEDSN=xx;UID=xx;PWD=xxx;DATABASE=dbname"
还可以用连接字符串(从而不用再建立dsn):
connstr="DRIVER={SQLSERVER};SERVER=servername;UID=xx;PWD=xxx"
(2)access:
用系统dsn:
connstr="DSN=dsnname"
(或者为:
connstr="DSN=dsnname;UID=xx;PWD=xxx")
用文件dsn:
connstr="FILEDSN=xx"
还可以用连接字符串(从而不用再建立dsn):
connstr="DRIVER={MicrosoftAccessDriver};DBQ=d:
\abc\abc.mdb"
2.用oledb连接数据库:
(1)sqlserver:
connstr="PROVIDER=SQLOLEDB;
DATASOURCE=servername;UID=xx;PWD=xxx;DATABASE=dbname"
(2)access:
connstr="PROVICER=MICROSOFT.JET.OLEDB.4.0;
DATASOURCE=c:
\abc\abc.mdb"
三、常用ADO对象方法和属性
1.Connection对象P214,P220
2.Command对象P214,P227
3.Recordset对象P215,P220
四、用其它语言访问SQL数据库
ASP,VB,VC,VFP,PB,Delphi,Access,ASP,JSP等,都可访问SQL数据库。
以下仅介绍ASP、VFP、Delphi。
五.ASP访问SQL数据库
1.常用ASP内建对象
Request
Response
Application
Session
Server
2.建立访问环境
可使用OLEDB或ODBC。
(1)建立使用OLEDB的访问环境
需要在“程序/管理工具/Internet服务器管理”中,右击“默认Web站点”,再单击“属性”,然后设置“主目录”和“文档”。
(如P218图6.8)
(2)建立使用ODBC数据源的环境
需要在“程序/管理工具/数据源(ODBC)”中配置,在DNS配置框中选“使用用户输入登录ID和密码的SQLServer验证”。
P213
3.连接到数据源P214
在ASP中引用ADO对象,要加前缀ADODB。
(1)创建一个ADOConnection对象。
例如:
Setcn=Server.CreateObject(“ADODB.Connection”)
(2)连接到数据源
①使用OLEDB接口
首先指定OLDDB提供者
例:
cn.Provider=”sqloledb”
再连接到数据源
例:
cn.Open“Server=zyxy;Database=教学管理;uid=sa;pwd=’’”
②使用ODBC数据源
例:
cn.Open“dsn=jxgl;uid=sa;pwd=’’”‘jxgl是2
(2)中建立的数据源
4.执行访问数据源的命令并创建结果集对象
例:
setrs=cn.Execute(“select*from学生where性别=’男’”)
5.关闭连接
例:
rs.close
cn.close
6.应用举例
例6.1P221
用cn.Excute创建的Recordset对象,在结果集中只能用MoveNext逐步向尾部单方向移动记录指针。
还有另一种方法创建Recordset对象:
P222L18。
用此种方法创建的Recordset对象的Open方法有四个参数。
六、在客户端用VFP访问网络数据库SQLServer上的数据库
(一)在客户端设置ODBC:
创建ODBC连接的操作步骤。
P213
开始/设置/控制面板/管理工具/数据源(ODBC)
在此添加数据源,命名数据源名(假定命名为jxgl),填写服务器名,使用SQLServer验证,更改默认的数据库。
附:
可继续完成以下设置:
在客户端VFP环境下打开项目管理器(项目中至少应有一个数据库),展开数据库,选择连接,单击新建按钮,打开连接设计器对话框,填写有关内容(也可以打开一个数据库,用createconnection命令打开连接设计器对话框),最后在保存对话框输入连接名(假定为LJ)。
该连接还可使用以下命令建立:
CREATECONNECTION<连接名>DATASOURCE<数据源名>USERIDPASSWORD<密码>DATABASE<数据库名>
例:
CREATECONNECTIONLJDATASOURCE“jxgl”USERID“sa”PASSWORD“”DATABASE“教学管理”
(二)在客户端VFP中使用SPT(SQLPassThrough)技术
1.连接数据源<连接句柄变量名>=SQLConnect(<数据源名>,,<帐户密码>)
例如:
dh=SQLCONNECT(“LJ”,”sa”,””)
也可使用<连接句柄变量名>=SQLStringConnect(“dsn=<数据源名>;uid=;pwd=<帐户密码>”)
例如dh=SQLStringConnect(“dsn=LJ;uid=sa;pwd=”)
如果连接成功,dh返回正整数句柄,失败返回-1。
附:
也可以使用命令<连接句柄变量名>=SQLConnect(<连接名>)
例:
DH=SQLConnect(“LJ”)
2.执行SQL命令SQLEXEC(<连接句柄变量名>,)
例如:
(1)SQLEXEC(dh,”SELECT*FROM课程”,”tmb”)
selecttmp
browse
在查询命令中添加READWRITE关键词,可得到可读写的临时表。
(2)SQLEXEC(dh,"INSERTINTO课程Values('W2060701','网络数据库',4,'网络数据库教程',Null,'马路长')")
(3)P1='W2060709'
P2='网络数据库'
P3='网络数据库教程'
SQLEXEC(dh,"INSERTINTO课程Values(?
P1,?
P2,4,?
P3,Null,'马路宽')")
用K=SQLEXEC(……,如果成功,K返回1,失败返回-1。
K=SQLEXEC(dh,"INSERT学生values('200299','胖胖','女','1983-11-11','上海',default,'200208',default,0,'200202')")
可用SQLCOMMIT(DH)、SQLROLLBACK(DH)提交或回滚事务。
3.断开连接SQLDISCONNECT(DH)
七、Delphi访问SQL数据库
1.ADO控件P304
2.使用TADODataSet访问SQL数据库(静态SQL命令)
例:
窗体如下图:
图中的控件及属性如下表:
控件名
属性名
属性值
ADODataSet1
ConnectionString
Provider=SQLOLEDB.1;Password=200704;PersistSecurityInfo=True;UserID=sa;InitialCatalog=教学管理;DataSource=JSJ1
CommandType
cmdText
CommandText
select学号,姓名,性别,出生日期,出生地,已修学分,组长,班级from学生WHERELEFT(出生地,2)='湖北'
DataSource1
DataSet
ADODataSet1
DBGrid1
DataSource
DataSource1
Button1
Caption
第一个
Button2
Caption
上一个
Button3
Caption
下一个
Button4
Caption
最后一个
Edit1
BitBtn1
Caption
&Close
Kind
bkClose
type
TForm1=class(TForm)
ADODataSet1:
TADODataSet;
DataSource1:
TDataSource;
DBGrid1:
TDBGrid;
BitBtn1:
TBitBtn;
Button1:
TButton;
Button2:
TButton;
Button3:
TButton;
Button4:
TButton;
Edit1:
TEdit;
procedureButton1Click(Sender:
TObject);
procedureButton3Click(Sender:
TObject);
procedureButton2Click(Sender:
TObject);
procedureButton4Click(Sender:
TObject);
private
{Privatedeclarations}
public
{Publicdeclarations}
end;
var
Form1:
TForm1;
implementation
{$R*.dfm}
procedureTForm1.Button1Click(Sender:
TObject);
vari:
single;
begin
ADODataset1.First;
i:
=ADODataset1.FieldByname('已修学分').value;
Edit1.Text:
=FloatToStr(i);
//Edit1.Text:
=ADODataset1.FieldByname('已修学分').value;
end;
procedureTForm1.Button3Click(Sender:
TObject);
begin
ADODataset1.Next;
Edit1.Text:
=ADODataset1.FieldByname('出生日期').Value;
end;
procedureTForm1.Button2Click(Sender:
TObject);
begin
ADODataset1.Prior;
Edit1.Text:
=ADODataset1.FieldByname('姓名').AsString;
end;
procedureTForm1.Button4Click(Sender:
TObject);
begin
ADODataset1.Last;
Edit1.Text:
=ADODataset1.FieldByname('姓名').AsString;
end;
end.
3.使用TADOQuery访问SQL数据库(动态SQL命令)
(1)将参数值嵌入SQL命令
adoquery1.Close;
adoquery1.SQL.Clear;
adoquery1.SQL.add('select学号,姓名,性别,出生日期,出生地,已修学分from学生where出生地like'''+edit5.text+'%''');
adoquery1.Open;
edit2.Text:
=adoquery1.FieldByName('姓名').AsString;
edit3.Text:
=adoquery1.FieldByName('性别').AsString;
edit4.Text:
=adoquery1.FieldByName('出生日期').AsString;
(2)使用命名参数
adoquery2.Close;
adoquery2.SQL.Clear;
adoquery2.SQL.add('insertinto成绩(学号,课程编号,分数)values(:
a1,:
a2,:
a3)');
adoquery2.Parameters.ParamByName('a1').Value:
=Edit1.Text;
adoquery2.Parameters.ParamByName('a2').Value:
=Edit2.Text;
adoquery2.Parameters.ParamByName('a3').Value:
=StrToFloat(edit3.text);
adoquery2.ExecSQL;
(3)混合使用嵌入参数值和命名参数
adoquery2.Close;
adoquery2.SQL.clear;
adoquery2.sql.Add('update学生set已修学分=已修学分+:
a1');
adoquery2.sql.Add('where班级='''+trim(edit5.text)+'''');
adoquery2.Parameters.ParamByName('a1').Value:
=strtofloat(edit1.text);
adoquery2.ExecSQL;
(4)
adoquery2.Close;
adoquery2.SQL.clear;
adoquery2.sql.Add('deletefrom成绩where学号=:
a1');
adoquery2.Parameters.ParamByName('a1').Value:
=trim(edit5.text);
adoquery2.execsql;
4.调用存储过程
已在SQLServer中执行了以下命令:
CREATEPROCEDUREJS0ASSELECT*FROM学生
CREATEPROCEDUREJS@CSDVARCHAR(10)ASSELECT*FROM学生WHERE出生地like@CSD+'%'
--在成绩表中添加一条记录,如果成绩及格,还要在学生表中增加学分。
CREATEPROCEDURE输入考试分数
@XHCHAR(6),@KCHCHAR(8),@FSDECIMAL(4,1)
AS
IFEXISTS(SELECT*FROM学生WHERE学号=@XH)
BEGIN
INSERT成绩VALUES(@XH,@KCH,@FS)
IF@FS>=60
UPDATE学生SET已修学分
=已修学分+(SELECT学分FROM课程WHERE课程编号=@KCH)
WHERE学号=@XH
END
ELSE
PRINT'无此学号'+@XH
--在成绩表中删除指定学号和课程的记录,如果所删的分数及格,还要在学生表中减去对应的学分。
CREATEPROCEDURE删除考试分数
@XHCHAR(6),@KCHCHAR(8)
AS
DECLARE@FSDECIMAL(4,1)
SET@FS=(SELECTMAX(分数)FROM成绩
WHERE学号=@XHAND课程编号=@KCH)
IF@FS>0
DELETEFROM成绩WHERE学号=@XHAND课程编号=@KCH
IF@FS>=60
UPDATE学生SET已修学分
=已修学分-(SELECT学分FROM课程WHERE课程编号=@KCH)
WHERE学号=@XH
(1)使用ADOStoredproc调用存储过程
①无参调用JS0
ADOStoredproc1.Close;
ADOStoredproc1.ProcedureName:
='js0';
ADOStoredproc1.Active:
=True;
②有参调用JS
ADOStoredproc1.Close;
ADOStoredproc1.Active:
=false;
ADOStoredproc1.ProcedureName:
='js';
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@csd').Value:
=trim(edit5.Text);
//ADOStoredproc1.Prepared;
ADOStoredproc1.Active:
=True;
③有参调用“输入考试分数”
ADOStoredproc1.Close;
ADOStoredproc1.Active:
=false;
ADOStoredproc1.ProcedureName:
='输入考试分数';
ADOStoredProc1.Parameters.Clear;
ADOStoredProc1.Parameters.Refresh;
ADOStoredProc1.Parameters.ParamByName('@XH').Value:
=trim(edit2.Text);
ADOStoredProc1.Parameters.ParamByName('@KCH').Value:
=trim(edit3.Text);
ADOStoredProc1.Parameters.ParamByName('@FS').Value:
=StrToFloat(trim(edit4.Text));
//ADOStoredproc1.Prepared;
ADOStoredproc1.ExecProc;
(2)使用TADOQuery调用存储过程
①无参调用JS0
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('js0');
adoquery1.OPEN;
DataSource1.DataSet:
=ADOQuery1;
②有参调用JS
ADOQuery1.Close;
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('js:
cs');
ADOQuery1.Parameters.Clear;
ADOQuery1.Parameters.Refresh;
ADOQuery1.Parameters.ParamByName('@csd').Value:
=trim(edit5.Text);
//adoquery1.ExecSQL;
adoquery1.OPEN;
③有参调用“输入考试分数”
ADOQuery1.SQL.Clear;
ADOQuery1.SQL.Add('输入考试分数:
a1,:
a2,:
a3');
ADOQuery1.Parameters.Clear;
ADOQuery1.Parameters.Refresh;
ADOQuery1.Parameters.ParamByName('@XH').Value:
=trim(edit2.Text);
ADOQuery1.Parameters.ParamByName('@KCH').Value:
=trim(edit3.Text);
ADOQuery1.Parameters.ParamByName('@FS').Value:
=StrToFloat(trim(edit4.Text));
adoquery1.ExecSQL;