登录  
 加关注
查看详情
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

高级菜鸟

积累并顺便分享AI,启动技术,C#,ASP.net等知识的地方

 
 
 

日志

 
 

asp数据库基本操作及相关知识  

2009-11-05 22:22:36|  分类: ASP学习 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |

最基本的 增、删、改、查

利用Recordset对象的方法实现

如果是从头到尾:用循环并判断指针是否到末       使用: not rs.eof  
如果是从尾到头:用循环并判断指针是否到开始     使用:not rs.bof  
以下均得事先得包含conn.asp用来打开数据库 
message为数据库中的一个数据表

rs.open sqlstr,conn,1,3 可以改为有意义 的常量,一般在adovbs.inc文件中定义再包含之

'---- CursorTypeEnum Values ----
Const adOpenForwardOnly = 0
Const adOpenKeyset = 1
Const adOpenDynamic = 2
Const adOpenStatic = 3
'---- LockTypeEnum Values ----
Const adLockReadOnly = 1
Const adLockPessimistic = 2
Const adLockOptimistic = 3
Const adLockBatchOptimistic = 4


增:增加数据库记录  
增加数据库记录用到rs.addnew,rs.update两个函数  

          rs.open sqlstr,conn,1,3          ---->(表示打开数据库的方式)  
          rs.addnew                       新增加一条或若干条记录  
          rs("name")="xx"                 将xx的值传给name字段  
          rs.update                       更新数据库   
------------------------------------------------------           
          rs.close  
          conn.close                     这几句是用来关闭数据库  
          set rs=nothing  
          set conn=nothing  
-------------------------------------------------------  

删:删除一条记录  
   删除数据库记录主要用到rs.delete,rs.update  

          rs.open sqlstr,conn,1,3          ---->(表示打开数据库的方式)    
          while not rs.eof  
           if rs.("name")=name then  
            rs.delete  
            rs.update              查询数据表中的name字段的值是否等于变量name的值"xx",如果符合就执行删除,  
           else                    否则继续查询,直到指针到末尾为止  
            rs.movenext  
           end if  
          wend  
------------------------------------------------------            
          rs.close  
          conn.close                     这几句是用来关闭数据库  
          set rs=nothing  
          set conn=nothing  
-------------------------------------------------------   

改:增加数据库记录  和[增]相似
增加数据库记录用到rs.addnew,rs.update两个函数  

          rs.open sqlstr,conn,1,3          ---->(表示打开数据库的方式)  

           while not rs.eof  
           if rs.("name")=name then  
            rs("name")="xx" 

           rs.update

           else                    否则继续查询,直到指针到末尾为止  
            rs.movenext  
           end if  
          wend  

------------------------------------------------------           
          rs.close  
          conn.close                     这几句是用来关闭数据库  
          set rs=nothing  
          set conn=nothing  
-------------------------------------------------------            
                      
查:显示数据库记录  
   原理:将数据库中的记录一一显示到客户端浏览器,依次读出数据库中的每一条记录  

          rs.open sqlstr,conn,1,3          ---->(表示打开数据库的方式)  
          rs.movefirst                     ---->(将指针移到第一条记录)  
          while not rs.eof                 ---->(判断指针是否到末尾)  
          response.write(rs("name"))       ---->(显示数据表message中的name字段)  
          rs.movenext                      ---->(将指针移动到下一条记录)  
          wend                             ---->(循环结束)  
------------------------------------------------------           
          rs.close  
          conn.close                     这几句是用来关闭数据库  
          set rs=nothing  
          set conn=nothing  
-------------------------------------------------------  

        其中response对象是服务器向客户端浏览器发送的信息  


但是最基本的往往存在很多不足.

更有效率的 增、删、改、查

         利用Connection对象的Excute方法加SQL语句实现(在数据库中直接筛选查询比在asp中快)如:

删:删除一条记录    
sqlstr="Delete from order Where name="&name
conn.Excute(sqlstr)

改:将上面的Delete改为Update,此处Update是更改数据库中已经存在的数据,与上面的Recordset对象的Update方法有所不同.

更灵活更有效率的 增、删、改、查

对于反复/大量操作,Command对象执行参数化的存储过程,更快!

Command 对象定义了将对数据源执行的命令,可以用于查询数据库表并返回一个记录集,也可以用于对数据库表进行添加、更改和删除操作。

一、使用Command 对象的步骤:

当在 ASP 页面中使用 Command 对象处理数据时,应首先设置命令类型、命令文本以及相关的活动数据库连接等,并通过 Parameter 对象传递命令参数,然后通过调用 Execute 方法来执行 SQL 语句或调用存储过程,以完成数据库记录的检索、添加、更改和删除任务。其步骤如下:

1、使用 ActiveCommand 属性设置相关的数据库连接;

2、使用 CommandType 属性设置命令类型;

1、adCmdText :表示处理的是一个 SQL 语句;

2、adCmdTable :表示处理的是一个表;

3、adCmdStoredProc :表示处理的是一个存储过程;

4、adCmdUnknow :表示不能识别,它是默认值。

3、使用 CommandText 属性定义命令(例如SQL语句)的可执行文本;

4、使用 CommandTimeout 属性设置命令超时时间;

5、使用 Execute 方法执行命令。

 

例:使用adCmdText

<%
'****************创建两个对象(连接对象和指令对象)和五个参数*********************
dim cnn,cmd
set cnn=Server.CreateObject("ADODB.Connection")
set cmd=Server.CreateObject("ADODB.Command")
'指定连接字符串,
cnn.ConnectionString="PROVIDER=Microsoft.jet.OLEDB.4.0;Data Source=" & server.MapPath("../rsgl.mdb")
cnn.Open
'设置ActiveConnection属性,使Command对象与打开的连接相关联
set cmd.ActiveConnection=cnn
'指定传送给数据提供者的命令文本是一条SQL语言。
cmd.CommandType=adCmdText
cmd.CommandText="INSERT INTO 员工基本情况表(员工姓名,所在部门,家庭住址,家庭电话,Email) values(?,?,?,?,?)"
'创建五个Parameter对象
set PrmName=cmd.CreateParameter("员工姓名",adVarChar,adParamInput,10)'可以设定参数
set PrmDepartment=cmd.CreateParameter("所在部门",adVarChar,adParamInput,10)
set PrmAddr=cmd.CreateParameter("家庭住址",adVarChar,adParamInput,12)
set PrmTel=cmd.CreateParameter("家庭电话",adVarChar,adParamInput,15)
set PrmEmail=cmd.CreateParameter("Email",adVarChar,adParamInput,20)
'将parameter对象添加到Parameters集合中。
cmd.Parameters.Append prmName
cmd.Parameters.Append prmDepartment
Cmd.Parameters.Append prmAddr
Cmd.Parameters.Append prmTel
Cmd.Parameters.Append prmEmail
'使用表单值设置参数值
PrmName.Value=Request.Form("txtName")
PrmDepartment.Value=Request.Form("txtDepartment")
PrmAddr.Value=Request.Form("txtAddr")
PrmTel.Value=Request.Form("txtTel")
PrmEmail.Value=Request.Form("txtEmail")
'执行INSERT插入命令
cmd.Execute
%>



更好的选择应该是使用adCmdStoredProc(存储过程)

在ASP中调用MSSQL存储过程(Stored Procedure)的介绍。可以使用两种方法:利用recordset对象,或者直接用command对象
  recordset对象相当简单,熟悉Asp的都能上手操作,这里简单做个实例:
  Mssql 中建立存储过程SP_UserList :
  CREATE PROCEDURE SP_UserList
  @Uid int
  AS
  select * from Users where Uid = @Uid
  return
  GO
  在SQL Server中执行存储过程:
  declare @Uid int
  execute SP_UserList 1
  使用recordset对象调用:
  Uid = 1
  set rs=server.createobject("adodb.recordset")
  sql = "exec SP_UserList "&Uid&""
  rs.open sql,conn,1,1
  或者:
  Uid = 1 '存储过程的输入参数,为简化程序, 直接设置该值
  sql = "SP_UserList "&Uid&""
  Set rs = Conn.Execute(sql) '或者Set rs = Conn.Execute("exec SP_UserList "&Uid&"")
  如果改用command对象来调用存储过程,如果不想使用魔鬼般的数字,则必须先加载adovbs.inc文件(文件adovbs.inc可在C:\Program Files\Common Files\System\ADO下找到):
  <!--必须加载adovbs.inc文件,否则将出错-->
  <!--#include file="adovbs.inc"-->
  '-----建立Connection对象----------
  set Conn = Server.CreateObject("Adodb.connection")
  Conn.Open "driver={sql server};server=localhost;uid=sa;pwd=;database=Mydbase;"
  Uid = 1
  '-----建立Command对象-----------
  set Comm = server.createobject("adodb.command")
  Comm.ActiveConnection = Conn

       Comm.CommandType = 4 'adCmdStoredProc = 4 ,其为Stored Procedure
  Comm.CommandText = "SP_UserList" '存储过程名称,指定要执行的是一个存储过程
  '-----准备 Stored Procedure 的参数-------
  Comm.Parameters.Append Comm.CreateParameter("@Uid",adInteger,adParamInput,4,Uid) '命令格式Set parameter = command.CreateParameter (Name, Type, Direction, Size, Value)
  '-----或者使用下列的方法定义 Stored Procedure 的参数:先创建输入参数对象,然后把参数加到参数集合-------
  'Set CommFirstParam = Comm.CreateParameter("@Uid",adInteger,adParamInput,4,Uid) '创建输入参数对象
  'Comm.Parameters.Append CommFirstParam '把参数加到参数集合

'或者先不给出Uid

'Set CommFirstParam = Comm.CreateParameter("@Uid",adInteger,adParamInput,4) '创建输入参数对象
  'Comm.Parameters.Append CommFirstParam '把参数加到参数集合

         Comm("@Uid")=Uid


  '-----执行存储过程----------------------
  Comm.Execute
  '-----下面输出参数结果----------------------
  response.write Comm.Parameters("@Uid")
  最后关闭command对象:Set Comm = Nothing。如果准备 Stored Procedure 的参数中采用的是创建输入参数对象的方法,则在最后还必须关闭对象:Set CommFirstParam = Nothing

 


     odbc与ole db

        一般,odbc是由一套扩展的dll(dynamic link library动态链接库)组成,dll提供了标准的数据库应用程序设计接口。而odbc是建立在标准化的sql(structuredQueryLanguage,结构化查询语言)之上。所以通过odbc和sql,就可以编写独立于任何数据库产品的数据访问程序。

用odbc连接数据库:

odbc中提供三种dsn,它们的区别很简单:用户dsn只能用于本用户。系统dsn和文件dsn的区别只在于连接信息的存放位置不同:系统dsn存放在odbc储存区里,而文件dsn则放在一个文本文件中。

在asp中使用它们时,写法如下:

A.链接sql server:

用系统dsn:

connstr="DSN=dsnname;UID=xx;PWD=xxx;DATABASE=dbname"

用文件dsn:

connstr="FILEDSN=xx;UID=xx;PWD=xxx;DATABASE=dbname"

还可以用连接字符串(从而不用再建立dsn):

connstr="DRIVER={SQL SERVER};SERVER=servername;UID=xx;PWD=xxx"

B.链接access:

用系统dsn:

connstr="DSN=dsnname"

(或者为:connstr="DSN=dsnname;UID=xx;PWD=xxx")

用文件dsn:

connstr="FILEDSN=xx"

还可以用连接字符串(从而不用再建立dsn):

connstr="DRIVER={Microsoft Access Driver};DBQ=d:\abc\abc.mdb"

缺陷:

ODBC含有大量的低级的调用,因此开发ODBC应用程序还比较困难. 开发者不得不将大量的精力花在底层的数据库通信中,而不能专注于他们所要处理的数据.

OLE DB
多年以来,ODBC 已成为访问客户端/服务器数据库的标准。ODBC 提供了基于标准的接口,接口要求 SQL 处理功能,并被优化用于基于 SQL 的方法。然而,如果要访问不使用 SQL 的非关系数据源(例如,不按照关系存储数据的 Microsoft Exchange Server)中的数据,情况会如何呢?
进入 OLE DB。OLE DB 建立于 ODBC 之上,并将此技术扩展为提供更高级数据访问接口的组件结构。此结构对企业中及 Internet 上的 SQL、非 SQL 和非结构化数据源提供一致的访问。(实际上,在访问基于 SQL 的数据时,OLE DB 仍使用 ODBC,因为对于 SQL 它是最优结构。)


OLE DB 由三个组件构成:数据使用者(例如,一个应用程序);包含并公开数据的数据提供程序以及处理并传输数据的服务组件(例如,查询处理器、游标引擎)。OLE DB 是一个针对 SQL 数据源和非 SQL 数据源(例如,邮件和目录)进行操作的 API。


OLE DB 为 C 和 C++ 程序员及使用其他包含 C 样式函数调用语言的程序员提供绑定。有一些语言(例如 VB 和 VBScript)不提供指针数据类型(地址变量)。因此,这些语言不能使用 C 样式绑定,而且不能直接调用 OLE DB。
它实际上包涵了Microsoft Jet数据库引擎,这是一个由Microsoft Access所使用的引擎,并允许应用程序开发者通过ODBC象直接链接到其它数据库一样,直接链接到Access表,当然也可以访问SQL SERVER数据库。Dao最适用于单系统应用程序或小范围本地分布使用。
在此基础上,Microsoft 推出了另一个数据访问对象模型:ADO(第一个是DAO)。ADO 采用基于 DAO 和 RDO 的对象,并提供比 DAO 和 RDO 更简单的对象模型(尽管会产生一些冗余的功能,如现在进行一项操作时可以用不止一种方法)。ADO 中的对象层次结构比 DAO 中的更平缓。ADO 包含一些简化对数据存储区数据的访问任务的内置对象。
而DAO是第一个面向对象的接口,DAO模型是设计关系数据库系统结构的对象类的集合。它们提供了完成管理一个关系型数据库系统所需的全部操作的属性和方法,这其中包括创建数据库,定义表、字段和索引,建立表间的关系,定位和查询数据库等

数据访问技术的演变http://www.microsoft.com/china/MSDN/library/data/sqlserver/TheEvolutionofData.mspx?mfr=true


连接数据库代码

asp连接access sql数据库代码及数据库操作
1. ASP与Access数据库连接:
dim strConn
dim conn
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="+Server.mappath("data/db1.mdb")+";Persist Security Info=False"
set conn = Server.CreateObject("ADODB.Connection")


2. ASP与SQL数据库连接:
dim conn
set conn=server.createobject("ADODB.connection")
con.open "PROVIDER=SQLOLEDB;DATA SOURCE=SQL服务器名称或IP地址;UID=sa;PWD=数据库密码;DATABASE=数据库名称


建立记录集对象: set rs=server.createobject("adodb.recordset")
rs.open SQL语句,conn,1,3


SQL常用命令使用方法:

数据记录筛选:
sql="select * from 数据表 where 字段名=字段值 order by 字段名 "
sql="select * from 数据表 where 字段名 like ‘%字段值%‘ order by 字段名 "
sql="select top 10 * from 数据表 where 字段名 order by 字段名 "
sql="select * from 数据表 where 字段名 in (‘值1‘,‘值2‘,‘值3‘)"
sql="select * from 数据表 where 字段名 between 值1 and 值2"

更新数据记录:
sql="update 数据表 set 字段名=字段值 where 条件表达式"
sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"

删除数据记录:
sql="delete from 数据表 where 条件表达式"
sql="delete from 数据表" (将数据表所有记录删除)

添加数据记录:
sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)

数据记录统计函数:
AVG(字段名) 得出一个表格栏平均值
COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
MAX(字段名) 取得一个表格栏最大的值
MIN(字段名) 取得一个表格栏最小的值
SUM(字段名) 把数据栏的值相加

引用以上函数的方法:
sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
set rs=conn.excute(sql)
用 rs("别名") 获取统计的值,其它函数运用同上。
 

数据表的建立和删除:
CREATE TABLE 数据表名称(字段1 类型1(长度),字段2 类型2(长度) …… )
例:CREATE TABLE tab01(name varchar(50),datetime default now())
DROP TABLE 数据表名称 (永久性删除一个数据表)

记录集对象的方法: 
rs.movenext 将记录指针从当前的位置向下移一行
rs.moveprevious 将记录指针从当前的位置向上移一行
rs.movefirst 将记录指针移到数据表第一行
rs.movelast 将记录指针移到数据表最后一行
rs.absoluteposition=N 将记录指针移到数据表第N行
rs.absolutepage=N 将记录指针移到第N页的第一行
rs.pagesize=N 设置每页为N条记录
rs.pagecount 根据 pagesize 的设置返回总页数
rs.recordcount 返回记录总数
rs.bof 返回记录指针是否超出数据表首端,true表示是,false为否
rs.eof 返回记录指针是否超出数据表末端,true表示是,false为否
rs.delete 删除当前记录,但记录指针不会向下移动
rs.addnew 添加记录到数据表末端
rs.update 更新数据表记录


   nchar,char,varchar与nvarchar的区别

         char类型: 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节,CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义 char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。因为是固定长度,所以速度效率高。

        Varchar类型:Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。

        由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉!

        VARCHAR存储变长数据,但存储效率没有CHAR高。如 果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。

        Nchar类型和Nvarchar类型是怎么一回事呢?为了与其他多种字符的转换,如中文,音标等,对每个英文(ASCII)字符都占用2个字节,对一个汉字也占用两个字节,所有的字符都占用2个字节。

例如

varchar(n):变长型字符数据类型,存储最长长度为8,000 个字符。

举个例子:
insert a select '木子a'
--- 存储长度为5个字节,余下的3个字节全部释放
insert a select '木神易
----存储长度为6个字节,余下的2个字节全部释放
---意思是varchar变长字符数据类型与存储数据的实际长度是一致的

nvarchar(n):可变长度 Unicode 数据,其最大长度为 4,000 字符。
字节的存储大小是所输入字符个数的两倍,
就是说它是双字节来存储数据的。
如果存储数据如果存在单字节时,它也是以双字节来占用存储空间的。

varchar一般适用于英文和数字,Nvarchar适用中文和其他字符,其中N表示Unicode常量,可以解决多语言字符集之间的转换问题

NVARCHAR
在存储时,无论是全角还是半角,每个字符都占用两个字节。
在定义时,无论全角或是半角,都是定义字符个数而不是字节数。
最多显示4000个字符(无论全角或半角)
是UNICODE标准字符集。
VARCHAR
在存储时每个半角字符占用1个字节,每个全角字符占用两个字节。
在定义时,如果要存储一个汉字,要定义VARCHAR(2)才可以。要存储一个半角英文字母,VARCHAR(1)即可。
最多显示8000个半角字,4000个全角字
是非UNICODE字符集。

NCHAR是定长字符,
NVARCHAR是不定长字符,
如果希望列中所有数据项的大小接近一致,则使用 nchar。
如果希望列中数据项的大小差异很大,则使用 nvarchar




 

  评论这张
 
阅读(1225)| 评论(0)

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018