ASP基础教材10.docx
《ASP基础教材10.docx》由会员分享,可在线阅读,更多相关《ASP基础教材10.docx(14页珍藏版)》请在冰点文库上搜索。
ASP基础教材10
ASP基础教材
——访问数据库
ActiveXDataObjects(ADO)是一项容易使用并且可扩展的将数据库访问添加到Web页的技术。
可以使用ADO去编写紧凑简明的脚本以便连接到OpenDatabaseConnectivity(ODBC)兼容的数据库和OLEDB兼容的数据源。
如果您是一个对数据库连接有一定了解的脚本编写人员,那么您将发现ADO命令语句并不复杂而且容易掌握。
同样地,如果您是一个经验丰富的数据库编程人员,您将会正确认识ADO的先进的与语言无关性和查询处理功能。
创建ODBCDSN文件
在创建数据库脚本之前,必须提供一条使ADO定位、标识和与数据库通讯的途径。
数据库驱动程序使用DataSourceName(DSN)定位和标识特定的ODBC兼容数据库,将信息从Web应用程序传递给数据库。
典型情况下,DSN包含数据库配置、用户安全性和定位信息,且可以获取WindowsNT注册表项中或文本文件的表格。
通过ODBC,您可以选择希望创建的DSN的类型:
用户、系统或文件。
用户和系统DSN存储在WindowsNT注册表中。
系统DSN允许所有的用户登录到特定的服务器上去访问数据库,而用户DSN使用适当的安全身份证明限制数据库到特定用户的连接。
文件DSN用于从文本文件中获取表格,提供了对多用户的访问,并且通过复制DSN文件,可以轻易地从一个服务器转移到另一个服务器。
由于以上原因,本主题中的示例将使用文件DSN。
通过在Windows的\"开始\"菜单打开\"控制面板\",您可以创建基于DSN的文件。
双击“ODBC\"图标,然后选择\"文件DSN\"属性页,单击\"添加\",选择数据库驱动程序,然后单击\"下一步\"。
按照后面的指示配置适用于您的数据库软件的DSN。
配置MicrosoftAccess数据库的文件DSN
在“创建新数据源”对话框中,从列表框选择“MicrosoftAccessDriver\",然后单击\"下一步\"。
键入您的DSN文件名,然后单击\"下一步\"。
单击“完成”创建数据源。
在“ODBCMicrosoftAccess97安装程序\"对话框中,单击\"选择\"。
选择MicrosoftAccess数据库文件(*.mdb),然后单击\"确定\"。
注意由于性能和可靠性的原因,我们极力推荐您使用“客户-服务器数据库引擎\"配置由这样一种Web应用程序驱动的数据,这些Web应用程序必须满足10个以上的用户的同时访问。
尽管ASP可以使用任何ODBC兼容的数据库,但它是为使用客户-服务器数据库而设计的,而且经过了严格的测试,这些数据库包括MicrosoftSQLServer、Oracle等。
ASP支持共享文件数据库(如MicrosoftAccess或MicrosoftFoxPro)作为有效的数据源。
尽管在ASP文档中的一些示例使用共享文件数据库,但我们建议只将此类数据库引擎用于开发或有限的配置方案。
共享文件数据库可能无法很好地适用于可满足高需求、高质量的Web应用程序的客户-服务器数据库。
配置SQLServer数据库文件DSN
注意如果数据库驻留在远程服务器上,请与服务器管理员联系,获取附加的配置信息;下面的过程使用SQLServer的ODBC默认的设置,它可能不适用于您的硬件配置。
在“创建新数据源”对话框中,从列表框中选择“SQLServer\",然后单击\"下一步\"。
键入DSN文件的名称,然后单击\"下一步\"。
单击“完成”创建数据源。
键入运行SQL服务程序的服务器的名称、登录ID和密码。
在“创建SQLServer的新数据源\"对话框中,在\"服务器\"列表框中键入包含SQLServer数据库的服务器的名称,然后单击\"下一步\"。
选择验证登录ID的方式。
如果要选择SQL服务器验证,请输入一个登录ID和密码,然后单击\"下一步\"。
在“创建SQLServer的新数据源\"对话框中,设置默认数据库、存储过程设置的驱动程序和ANSI标识,然后单击\"下一步\"。
(要获取详细信息,请单击\"帮助\"。
)
在对话框(同样名为“创建SQLServer的新数据源”)中,选择一种字符转换方法,然后单击“下一步”。
(详细信息,请单击“帮助”。
)
在下一个对话框(同样名为“创建SQLServer的新数据源\")中,选择登录设置。
注意典型情况下,您只能使用日志来调试数据库访问问题。
在“ODBCMicrosoftSQLServer安装程序”对话框中,单击“测试数据源”。
如果DSN正确创建,\"测试结果\"对话框将指出测试成功完成。
SQLserver连接和安全信息
如果您正在开发用于连接远程SQLServer数据库的ASP数据库应用程序,应考虑以下问题:
连接方案:
您可以选择TCP/IP套接字和命名管道的方法访问远程的SQLServer数据库。
当使用命名管道时,因为在建立连接之前,数据库用户必须被WindowsNT确认,所以对只有适当的SQLServer访问身份而在该计算机上没有WindowsNT用户帐号的用户可能会被拒绝访问命名管道。
作为一种替代方案,使用TCP/IP套接字的连接可直接连接到数据库服务器,而不必通过使用命名管道的中间计算机。
因为使用TCP/IP套接字连接可直接连接到数据库server,所以通过SQLServer的确认,用户就可以获得访问权,而不必通过WindowsNT的确认。
注意在连接到远程数据库时使用TCP/IP套接字可提高性能。
安全性:
如果您使用SQLServer的集成或混合安全特性,并且SQLServer数据库位于远程服务器上,则不能使用WindowsNT请求/响应的确认。
也就是说,不能将WindowsNT请求/响应身份证转发到远程计算机上,而只能使用基本身份验证,它根据用户提供用户名和口令信息进行。
有关这一主题的详细信息,请参阅SQLServer技术支持主页。
配置Oracle数据库文件DSN
首先要确保Oracle用户软件被正确地安装要创建DSN的计算机上。
详细信息,请与服务器管理员联系或参阅数据库软件文档。
在“创建新数据源”对话框中,从列表框中选择“MicrosoftODBCforOracle\",然后单击\"下一步\"。
键入DSN文件的名称,然后单击\"下一步\"。
单击“完成”创建数据源。
输入用户名、密码和服务器名,然后单击“确定”。
注意DSN文件用.dsn扩展名,位于\Programs\CommonFiles\ODBC\DataSources目录中。
有关创建DSN文件的详细信息,请访问MicrosoftODBCWeb站点:
连接数据库
访问数据库信息的第一步是和数据库源建立连接。
ADO提供Connection对象,可以使用该对象建立和管理应用程序和ODBC数据库之间的连接。
Connection对象具有各种属性和方法,可以使用它们打开和关闭数据库连接,并且发出查询请求来更新信息。
要建立数据库连接,首先应创建Connection对象的实例。
例如,下面的脚本创建Connection对象,接着打开数据库连接:
<%
'Createaconnectionobject
Setcn=Server.CreateObject(\"ADODB.Connection\")
'Openaconnection;thestringreferstotheDSN
cn.Open\"FILEDSN=MyDatabase.dsn\"
%>
注意无论在等号(=)之前还是之后,DSN字符串都不能包含空格。
在这种情况下,Connection对象的Open方法引用基于DSN的文件,其中包含关于数据库的位置和配置信息。
也可以不引用DSN,直接显式引用供应程序、数据源、用户ID和密码。
有关建立连接的可选方法的详细信息,请参阅MicrosoftActiveXDataObjects(ADO)。
用Connection对象执行查询
用Connection对象的Execute方法,您可以发出结构化查询语言(SQL)查询数据库源并检索结果。
SQL是用于与数据库通讯的工业标准语言,它有许多命令可用来检索和更新信息。
下面的脚本使用Connection对象的Execute方法在SQLINSERT命令的表格中发出查询,该命令将数据插入特定的数据库表格。
在下面的示例中,脚本将名称JoseLugo插入名为Customers的数据库表中。
<%
'DefinefilebasedDSN
strDSN=\"FILEDSN=MyDatabase.dsn\"
'InstantiatetheConnectionobjectandopenadatabaseconnection
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.OpenstrDSN
'DefineSQLSELECTstatement
strSQL=\"INSERTINTOCustomers(FirstName,LastName)VALUES
('Jose','Lugo')\"
'UsetheExecutemethodtoissueaSQLquerytodatabase
cn.Execute(strSQL)
%>
注意基于DSN路径字符串的文件在等号(=)前后不应包含空格。
除了SQLINSERT命令以外,您也可以使用SQLUPDATE和DELETE命令更改和删除数据库信息。
用SQLUPDATE命令,您可以改变数据库表中各项目值。
下面的脚本使用UPDATE命令将Customers表中每个LastName字段包含姓Smith记录的FirstName字段更改为Jeff。
<%
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.Open\"FILEDSN=MyDatabase.dsn\"
cn.Execute\"UPDATECustomersSETFirstName='Jeff'WHERELastName=
'Smith'\"
%>
要想从数据库表中删除特定的记录,可使用SQLDELETE命令。
下面的脚本从Customers表中删除了所有姓Smith的行:
<%
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.Open\"FILEDSN=MyDatabase.dsn\"
cn.Execute\"DELETEFROMCustomersWHERELastName='Smith'\"
%>
注意在使用SQLDELETE命令时,必须谨慎从事。
当使用不带WHERE子句的DELETE命令时,它将删除表中的所有行。
一定要包含SQLWHERE子句来指定要删除的确切行。
使用Recordset对象处理结果
尽管Connection对象简化了连接数据库和查询任务,但Connection对象仍有许多不足。
确切地说,检索和显示数据库信息的Connection对象不能用于创建脚本;您必须确切知道要对数据库作出的更改,然后才能使用查询实现更改。
对于检索数据、检查结果、更改数据库,ADO提供了Recordset对象。
正如它的名称所暗示的那样,Recordset对象有许多您可以使用的特性,根据您的查询限制,检索并且显示一组数据库行,即记录。
Recordset对象保持查询返回的记录的位置,允许您一次一项逐步扫描结果。
根据Recordset对象的指针类型属性设置,您可以滚动和更新记录。
数据库指针可以让您在一组记录中定位到特定的项。
指针还用于检索和检查记录,然后在这些记录的基础上执行操作。
Recordset对象有一些属性,可用于精确地控制指针的行为,提高您检查和更新结果的能力。
例如,您可以使用CursorType和CursorLocation属性设置指针的类型,将结果返回给客户端应用程序(结果通常保留在数据库服务器上)并显示其他用户对数据库的最后一次更改。
有关配置Recordset对象指针的信息,请参阅MicrosoftActiveXDataObjects(ADO)。
检索记录
一个成功的数据库应用程序都使用Connection对象建立链接并使用Recordset对象处理返回的数据。
通过“协调”两个对象的特定功能,您可以开发出几乎可以执行任何数据处理任务的数据库应用程序。
例如,下面的服务器端脚本使用Recordset对象执行SQLSELECT命令。
SELECT命令检索一组基于查询限制的信息。
查询也包含SQLWHERE子句,用来缩小查询的范围。
此例中,WHERE子句将查询限制为所有的Customers数据库表中包含的姓Smith的记录。
<%
'Establishaconnectionwithdatasource
strDSN=\"FILEDSN=MyDatabase.dsn\"
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.OpenstrDSN
'InstantiateaRecordsetobject
SetrsCustomers=Server.CreateObject(\"ADODB.Recordset\")
'OpenarecordsetusingtheOpenmethod
'andusetheconnectionestablishedbytheConnectionobject
strSQL=\"SELECTFirstName,LastNameFROMCustomersWHERELastName=
'Smith'\"
rsCustomers.OpenstrSQL,cn
Cyclethroughrecordsetanddisplaytheresults
'andincrementrecordpositionwithMoveNextmethod
SetobjFirstName=rsCustomers(\"FirstName\")
SetobjLastName=rsCustomers(\"LastName\")
DoUntilrsCustomers.EOF
Response.WriteobjFirstName&\"\"&objLastName&\"
\"
rsCustomers.MoveNext
Loop
%>
注意,在前面的例子中,用来建立数据库连接的Connection对象和Recordset对象使用该连接从数据库中检索结果。
当您需要精确地设置和数据库建立链接所采用的方式时,这个方法是非常有用的。
例如,如果您需要在连接尝试失败之前指定等待的时间,则需要使用Connection对象去设置属性。
但是,如果您仅仅想使用ADO默认的连接属性建立连接,则应该使用Recordset对象的Open方法去建立链接:
<%
strDSN=\"FILEDSN=MyDatabase.dsn\"
strSQL=\"SELECTFirstName,LastNameFROMCustomersWHERELastName=
'Smith'\"
SetrsCustomers=Server.CreateObject(\"ADODB.Recordset\")
'OpenaconnectionusingtheOpenmethod
'andusetheconnectionestablishedbytheConnectionobject
rsCustomers.OpenstrSQL,strDSN
'Cyclethroughtherecordset,displaytheresults,
'andincrementrecordpositionwithMoveNextmethod
SetobjFirstName=rsCustomers(\"FirstName\")
SetobjLastName=rsCustomers(\"LastName\")
DoUntilrsCustomers.EOF
Response.WriteobjFirstName&\"\"&objLastName&\"
\"
rsCustomers.MoveNext
Loop
%>
当使用Recordset对象的Open方法建立一个连接时,必须使用Connection对象去保证链接的安全。
详细信息,请参阅MicrosoftActiveXDataObjects(ADO)。
用Command对象改善查询
通过ADOCommand对象,可以象用Connection对象和Recordset对象那样执行查询,唯一的不同在于用Command对象您可以在数据库源上准备、编译您的查询并且反复使用一组不同的值来发出查询。
这种方式的编译查询的优点是您可以最大程度地减少向现有查询重复发出修改的请求所需的时间。
另外,您还可以在执行之前通过您的查询的可变部分的选项使SQL查询保持局部未定义。
Command对象的parameter集合减少了您的麻烦,使您不必在每次重新发出查询时重新建立查询。
例如,如果需要有规律地更新基于库存清单的Web系统中的供应和价格信息,可以用下面的方法预先定义查询:
<%
'OpenaconnectionusingConnectionobjectCommandobject
'doesnothaveanOpenmethodforestablishingaconnection
strDSN=\"FILEDSN=MyDatabase.dsn\"
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.OpenstrDSN
'InstantiateCommandobject;useActiveConnectionpropertytoattach
'connectiontoCommandobject
Setcm=Server.CreateObject(\"ADODB.Command\")
Setcm.ActiveConnection=cn
'DefineSQLquery
cm.CommandText=\"INSERTINTOInventory(Material,Quantity)VALUES
(?
?
)\"
'Saveaprepared(orpre-compiled)versionofthequeryspecifiedin
CommandText
'propertybeforeaCommandobject'sfirstexecution.
cm.Prepared=True
'Definequeryparameterconfigurationinformation
cm.Parameters.Appendcm.CreateParameter(\"material_type\",200,,255)
cm.Parameters.Appendcm.CreateParameter(\"quantity\",200,,255)
'Defineandexecutefirstinsert
cm(\"material_type\")=\"lightbulbs\"
cm(\"quantity\")=\"40\"
cm.Execute
'Defineandexecutesecondinsert
cm(\"material_type\")=\"fuses\"
cm(\"quantity\")=\"600\"
cm.Execute
%>
请检查上面的例子,您将注意到,脚本用不同的数值重复构建和发出一个SQL查询,而没有重新定义和重发送查询到数据库源。
用Command对象编译查询也可避免SQL查询引起的合并字符串和表格变量问题。
特别是,通过使用Command对象的Parameter集合可以避免与定义字符串、日期、时间变量的类型有关的问题。
例如,包含\"'\"的SQL查询值可能导致查询失败:
strSQL=\"INSERTINTOCustomers(FirstName,LastName)VALUES('Robert','O'Hara')\"
注意,姓O'Hara中包含一个\"'\",它与在SQLVALUES关键字中用来表示数据的“'\"冲突。
通过将查询数值作为Command对象参数绑定,可以避免此类问题。
结合HTML表格和数据库访问
包含HTML表格的Web页可使用户远程查询数据库并且检索特定的信息。
用ADO您可以创建非常简单的脚本来收集用户表格信息、创建自定义的数据库查询以及将信息返回给用户。
使用ASPRequest对象,您可以检索输入到HTML表格的信息并将这些信息合并到SQL语句中。
例如,下面的脚本模块将HTML表格提供的信息插入表格中。
此脚本用Request对象的Form集合收集用户信息。
<%
'OpenaconnectionusingConnectionobject.TheCommandobject
'doesnothaveanOpenmethodforestablishingaconnection
strDSN=\"FILEDSN=MyDatabase.dsn\"
Setcn=Server.CreateObject(\"ADODB.Connection\")
cn.OpenstrDSN
'InstantiateCommandobject
'anduseActiveConnectionpropertytoattach
'connectiontoCommandobject
Setcm=Server.CreateObject(\"ADODB.Command\")
Setcm.ActiveConnection=cn
'DefineSQLquery
cm.CommandText=\"INSERTINTOMySeedsTable(Type)VALUES(?
)\"
'Definequeryparameterconfigurationinformation
cm.Parameters.Appendcm.CreateParameter(\"type\",200,,255)
'Defineandexecuteinsert
cm(\"type\")=Request(\"SeedType\")
cm.Execute
%>
有关表格和使用ASPRequest对象的详细信息,请参阅使用HTML表格。
管理数据库连接
设