用ASP连接各种数据库的方法

用ASP连接各种数据库的方法
2011年04月22日
  一、ASP的对象存取数据库方法 
  在ASP中,用来存取数据库的对象统称ADO(Active Data Objects),主要含有三种对象:
    Connection、Recordset 、Command
    Connection:负责打开或连接数据
    Recordset:负责存取数据表
    Command:负责对数据库执行行动查询命令
    二、连接各数据库的驱动程序
    连接各数据库可以使用驱动程序,也可以使用数据源,不过我建议大家使用驱动程序,因为使用驱动程序非常方便、简单,而使用数据源比较麻烦。
    ODBC链接
    适合数据库类型 链接方式
  access "Driver={microsoft access driver(*.mdb)};dbq=*.mdb;uid=admin;pwd=pass;"
  dBase "Driver={microsoft dbase driver(*.dbf)};driverid=277;dbq=------------;"
  Oracle "Driver={microsoft odbc for oracle};server=oraclesever.world;uid=admin;pwd=pass;"
  MSSQL server "Driver={sql server};server=servername;database=dbname;uid=sa;pwd=pass;"
  MS text "Driver={microsoft text driver(*.txt; *.csv)};dbq=-----;extensions=asc,csv,tab,txt;Persist SecurityInfo=false;"
  Visual Foxpro "Driver={microsoft Visual Foxpro driver};sourcetype=DBC;sourceDB=*.dbc;Exclusive=No;"
  MySQL "Driver={mysql};database=yourdatabase;uid=username;pwd=yourpassword;option=16386;"
    OLEDB链接
    适合的数据库类型 链接方式
  access "Provider=microsoft.jet.oledb.4.0;data source=your_database_path;user id=admin;password=pass;"
  Oracle "Provider=OraOLEDB.Oracle;data source=dbname;user id=admin;password=pass;"
  MS SQL Server "Provider=SQLOLEDB;data source=machinename;initial catalog=dbname;userid=sa;password=pass;"
  MS text "Provider=microsof.jet.oledb.4.0;data source=your_path;Extended Properties′text;FMT=Delimited′"
    而我们在一般情况下使用Access的数据库比较多,在这里我建议大家连接Access数据库使用下面的方法:
  dim conn
  set conn = server.createobject("adodb.connection")
  conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("../db/bbs.mdb")
    其中../db/bbs.mdb是你的数据库存放的相对路径!如果你的数据库和ASP文件在同一目录下,你只要这样写就可以了:
  dim conn
  set conn = server.createobject("adodb.connection")
  conn.open = "provider=microsoft.jet.oledb.4.0;" & "data source = " & server.mappath("bbs.mdb")
    有许多初学者在遇到数据库连接时总是会出问题,然而使用上面的驱动程序只要你的数据库路径选对了就不会出问题了。
  ASP与数据库应用
  完整的站点是离不开数据库的,因为实际应用中,需要保存的数据很多,而且这些数据之间往往还有关联,利用数据库来管理这些数据,可以很方便的查询和更新。数据库有很多种,如:Fox 数据库(.dbf)、Access 数据库(.mdb)、Informix、Oracle 和 SQL Server 等等,在这里,我将以 Microsoft Access 数据库为例来说明ASP是如何访问数据库的。
  常用数据库语句
    1.SELECT 语句:命令数据库引擎从数据库里返回信息,作为一组记录。
    2.INSERT INTO 语句:添加一个或多个记录至一个表。
    3.UPDATE 语句:创建更新查询来改变基于特定准则的指定表中的字段值。
    4.DELETE 语句:创建一个删除查询把记录从 FROM 子句列出并符合 WHERE 子句的一个或更多的表中清除。
    5.EXECUTE 语句:糜诩せ?PROCEDURE(过程)
  用 ASP 来做一个自己的通讯录练练手吧……
  一、建立数据库:
    用 Microsoft Access 建立一个名为 data.mdb 的空数据库,使用设计器创建一个新表。输入以下几个字段:
    字段名称  数据类型  说明      其它
    ID     自动编号  数据标识    字段大小:长整型 新值:递增 索引:有(无重复)
    username  文本    姓名      缺省值
    usermail  文本    E-mail     缺省值
    view    数字    查看次数    字段大小:长整型 默认值:0 索引:无
    indate   时间日期  加入时间    缺省值
    保存为 data.mdb 文件,为了便于说明,只是做了一个比较简单的库。
  二、连接数据库
    方法1:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
    方法2:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source="&Server.MapPath("data.mdb")
    注意:一个页面中,只要连接一次就可以了,数据库使用完后要及时关闭连接。
    conn.Close
    Set conn = Nothing
  三、添加新记录到数据库
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
    username = "风云突变"
    usermail = "[ft=#993300,,"
    indate = Now()
    sql = "insert into data (username,usermail,indata) values('"&username&"','"&usermail&"','"&indate&"')"
    conn.Execute(sql)
    conn.Close
    Set conn = Nothing
    说明:建立数据库连接;通过表单获取姓名、E-mail 字符串,Now()获取当前时间日期;使用 insert into 语句添加新记录;conn.Execute 来执行;最后关闭。
  四、选择数据库里的记录
    1.选择所有记录的字段(按记录倒序排序):sql = "select * from data order by ID desc"
    2.选择所有记录的姓名和E-mail字段(不排序):sql = "select username,usermail from data"
    3.选择姓名为“风云突变”的所有记录:sql = "select * from data where username='"风云突变"'"
    4.选择使用 163 信箱的所有记录(按查看次数排序):sql = "select * from data where usermail like '%"@163.com"%' order by view desc"
    5.选择最新的10个记录:sql = "select top 10 * from data order by ID desc"
    SQL 语句已经知道了,不过在Web应用时,还得创建一个 RecordSet 对象得到记录集,才能把从数据库里取出的值应用在网页上,如果现在将所有的记录显示在网页上就这样:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
    sql = "select * from data"
    Set rs = Server.CreateObject("ADODB.RecordSet")
    rs.Open sql,conn,1,1
    Do While Not rs.Eof
      Response.Write "
  姓名:"& rs("username") &" E-mail:"& rs("usermail") &" 查看:"& rs("view") &"次 "& rs("indate") &"加入
  "
      rs.MoveNext
    Loop
    rs.Close
    Set rs = Nothing
    conn.Close
    Set conn = Nothing
    说明:建立数据库连接;创建 rs 得到记录集;循环显示记录,rs.Eof 表示记录末,rs.MoveNext 表示移到下一个记录;最后关闭。
  五、修改(更新)数据库记录
    修改记录的E-mail:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
    ID = 1
    usermail = "[ft=#993300,,"
    sql = "update data set usermail='"&usermail&"' where ID="&CInt(ID)
    conn.Execute(sql)
    conn.Close
    Set conn = Nothing
    说明:建立数据库连接;获取记录ID、新 E-mail 字符串;使用 update 语句修改记录;conn.Execute 来执行;最后关闭。
    如果使记录的查看值加1,则:sql = "update data set view=view+1 where ID="&CInt(ID)
  六、删除数据库记录
    删除某一条记录:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq="&Server.MapPath("data.mdb")
    ID = 1
    sql = "delete from data where ID="&CInt(ID)
    conn.Execute(sql)
    conn.Close
    Set conn = Nothing
    说明:建立数据库连接;获取记录ID;使用 delete 语句删除记录;conn.Execute 来执行;最后关闭。
    删除多条记录为:sql = "delete from data where ID in (ID1,ID2,ID3)"
    删除所有记录为:sql = "delete from data"
  总结:
    以上教程是针对ASP的初学者而写的,只是介绍了一些基本的用法,在了解之后可以自己去试试,重要的在于能举一反三、综合运用。更多的语法和参数请参阅 Microsoft Access 帮助中的 Microsoft Jet SQL 参考
  一、无组件上传的原理
  我还是一点一点用一个实例来说明的吧,客户端HTML如下。要浏览上传附件,我们通过元素,但是一定要注意必须设置form的enctype属性为"multipart/form-data":
  代码没有出来,如果那位老大有。请补充。
  在后台asp程序中,以前获取表单提交的ASCII 数据,非常的容易。但是如果需要获取上传的文件,就必须使用Request对象的BinaryRead方法来读取。BinaryRead方法是对当前输入流进行指定字节数的二进制读取,有点需要注意的是,一旦使用BinaryRead 方法后,再也不能使用Request.Form 或 Request.QueryString 集合了。结合Request对象的TotalBytes属性,可以将所有表单提交的数据全部变成二进制,不过这些数据都是经过编码的。首先让我们来看看这些数据是如何编码的,有无什么规律可循,编段代码,在代码中我们将BinaryRead读取的二进制转化为文本,输出出来,在后台的upload.asp中(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
  " & PostData & "" '使用pre,原样输出格式
  ' 借助RecordSet将二进制流转化成文本
  Function BinaryToString(biData,Size)
  Const adLongVarChar = 201
  Set RS = createObject("ADODB.Recordset")
  RS.Fields.Append "mBinary", adLongVarChar, Size
  RS.Open
  RS.AddNew
  RS("mBinary").AppendChunk(biData)
  RS.update
  BinaryToString = RS("mBinary").Value
  RS.Close
  End Function
  %>
  简单起见,上传一个最简单的文本文件(G:\homepage.txt,内容为"宝玉:http://www.webuc.net")来试验一下,文本框filename中保留默认值"default filename",提交看看输出结果:
  -----------------------------7d429871607fe
  Content-Disposition: form-data; name="file1"; filename="G:\homepage.txt"
  Content-Type: text/plain
  宝玉:http://www.webuc.net
  -----------------------------7d429871607fe
  Content-Disposition: form-data; name="filename"
  default filename
  -----------------------------7d429871607fe--
  可以看出来对于表单中的项目,是用过"-----------------------------7d429871607fe"这样的边界来分隔成一块一块的,每一块的开始都有一些描述信息,例如:Content-Disposition: form-data; name="filename",在描述信息中,通过name="filename"可以知道表单项的name。如果有filename="G:\homepage.txt"这样的内容,说明是一个上传的文件,如果是一个上传的文件,那么描述信息会多一行Content-Type: text/plain来描述文件的Content-Type。描述信息和主体信息之间是通过换行来分隔的。
  嗯,基本上清晰了,根据这个规律我们就知道该怎么来分离数据,再对分离的数据进行处理了,不过差点忽略一个问题,就是边界值(上例中的"-----------------------------7d429871607fe")是怎么知道的?每次上传这个边界值是不一样的,还好还好asp中可以通过Request.ServerVariables( "HTTP_CONTENT_TYPE")来获之,例如上例中HTTP_CONTENT_TYPE内容为:"multipart/form-data; boundary=---------------------------7d429871607fe",有了这个,我们不仅可以判断客户端的form中有无使用enctype="multipart/form-data"(如果没有使用,那么下面就没必要执行啦),还可以获取边界值boundary=---------------------------7d429871607fe。(注意:这里获取的边界值比上面的边界值开头要少"--",最好补充上。)
  至于如何分析数据的过程我就不多赘述了,无非就是借助InStr,Mid等这样的函数来分离出来我们想要的数据。
  二、分块上传,记录进度
  要实时反映进度条,实质就是要实时知道当前服务器获取了多少数据?再回想一下我们实现上传的过程,我们是通过Request.BinaryRead(Request.TotalBytes)来实现的,在Request的过程中我们无法得知当前服务器获取了多少数据。所以只能通过变通的方法了,如果我们可以将获取的数据分成一块一块的,然后根据已经上传的块数我们就可以算出来当前上传了多大了!也就是说,如果我1K为1块,那么上传1MB的输入流就分成1024块来获取,例如我当前已经获取了100块,那么就表明当前上传了100K。当我提出分块的时候很多人觉得不可思议,因为他们都忽略BinaryRead方法不仅是可以读取指定大小,而且可以连续读取的。
  写个例子来验证一下分块读取的完整性,在刚才的例子基础上(注意该示例不要上传大文件,否则可能会造成浏览器死掉):
  TotalBytes Then ReadedBytes = TotalBytes
  Loop
  Response.Write "" & PostData & "" ' 使用pre,原样输出格式
  ' 将二进制流转化成文本
  Function BinaryToString(biData,Size)
  Const adLongVarChar = 201
  Set RS = createObject("ADODB.Recordset")
  RS.Fields.Append "mBinary", adLongVarChar, Size
  RS.Open
  RS.AddNew
  RS("mBinary").AppendChunk(biData)
  RS.update
  BinaryToString = RS("mBinary").Value
  RS.Close
  End Function
  %>
  试验一下上传刚才的文本文件,输出结果证明这样分块读取的内容是完整的,并且在While循环中,我们可以在每次循环时将当前状态记录到Application中,然后我们就可以通过访问该Application动态获取上传进度条。
  另:上例中是通过字符串拼接的,如果是要拼接二进制数据,可以通过ADODB.Stream对象的Write方法,示例代码如下:
  Set bSourceData = createobject("ADODB.Stream")
  bSourceData.Open
  bSourceData.Type = 1 'Binary
  Do While ReadedBytes TotalBytes Then ReadedBytes = TotalBytes
  Application("ReadedBytes") = ReadedBytes
  Loop
  三、保存上传的文件
  通过Request.BinaryRead获取提交数据,分离出上传文件后,根据数据类型的不同,保存方式也不同:
  对于二进制数据,可以直接通过ADODB.Stream对象的SaveToFile方法,将二进制流保存成为文件。
  对于文本数据,可以通过TextStream对象的Write方法,将文本数据保存到文件中。
  对于文本数据和二进制数据,是可以方便的相互转换的,对于上传小文件来说,两者基本上没什么差别。但是两种方式保存时还是有一些差别的,对于ADODB.Stream对象,必须将所有数据全部装载完才可以保存成文件,所以使用这种方式如果上传大文件将很占用内存,而对于TextStream对象,可以在文件创建好后,一次Write一部分,分多次Write,这样的好处是不会占用服务器内存空间,结合上面分析的分块获取数据原理,我们可以每获取一块上传数据就将之Write到文件中。我曾做过试验,同样本机上传一个200多MB的文件,使用第一种方式内存一直在涨,到最后直接提示计算机虚拟内存不足,最可恨是即使进度条表示文件已经上传完,但是最终文件还是没有保存上。而使用后一种方法,上传过程中内存基本上无什么变化。
  四、未解决的难题
  我在博客园上看到Bestcomy描述他的Asp.Net上传组件是可以和Sever.SetTimeOut无关的,而在Asp中我是没能做到,对于上传大文件,就只有将Server.SetTimeOut设置为一个很大的值才可以。不知道有没有比较好的解决方法。
  如果我们在保存文件时,使用TextStream对象的Write方法,那么如果用户上传时中断了文件传输,已经上传的那部分文件还是在的,如果可以断点续传就好了。关键问题是Request.BinaryRead方法虽然可以分块读取,但是却不能跳过某一段读取!
  如何注册组件
  答:有两种方法。
  第一种方法:手工注册 DLL 这种方法从IIs 3.0一直使用到IIs 4.0和其它的Web Server。它需要你在命令行方式下来执行,进入到包含有DLL的目录,并输入:regsvr32 component_name.dll 例如 c:\temp\regsvr32 AspEmail.dll 它会把dll的特定信息注册入服务器中的注册表中。然后这个组件就可以在服务器上使用了,但是这个方法有一个缺陷。当使用这种方法注册完毕组件后,该组件必须要相应的设置NT的匿名帐号有权限执行这个dll。特别是一些组件需要读取注册表,所以,这个注册组件的方法仅仅是使用在服务器上没有MTS的情况下,要取消注册这个dll,使用:regsvr32 /u aspobject.dll example c:\temp\regsvr32 /u aneiodbc.dll
  SQL常用命令使用方法:
  (1) 数据记录筛选:
  sql="select * from 数据表 where 字段名=字段值 order by 字段名 [desc]"
  sql="select * from 数据表 where 字段名 like '%字段值%' order by 字段名 [desc]"
  sql="select top 10 * from 数据表 where 字段名 order by 字段名 [desc]"
  sql="select * from 数据表 where 字段名 in ('值1','值2','值3')"
  sql="select * from 数据表 where 字段名 between 值1 and 值2"
  (2) 更新数据记录:
  sql="update 数据表 set 字段名=字段值 where 条件表达式"
  sql="update 数据表 set 字段1=值1,字段2=值2 …… 字段n=值n where 条件表达式"
  (3) 删除数据记录:
  sql="delete from 数据表 where 条件表达式"
  sql="delete from 数据表" (将数据表所有记录删除)
  (4) 添加数据记录:
  sql="insert into 数据表 (字段1,字段2,字段3 …) valuess (值1,值2,值3 …)"
  sql="insert into 目标数据表 select * from 源数据表" (把源数据表的记录添加到目标数据表)
  (5) 数据记录统计函数:
  AVG(字段名) 得出一个表格栏平均值
  COUNT(*|字段名) 对数据行数的统计或对某一栏有值的数据行数统计
  MAX(字段名) 取得一个表格栏最大的值
  MIN(字段名) 取得一个表格栏最小的值
  SUM(字段名) 把数据栏的值相加
  引用以上函数的方法:
  sql="select sum(字段名) as 别名 from 数据表 where 条件表达式"
  set rs=conn.excute(sql)
  用 rs("别名") 获取统的计值,其它函数运用同上。
  (5) 数据表的建立和删除:
  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 更新数据表记录
  Recordset对象方法
  Open方法
  recordset.Open Source,ActiveConnection,CursorType,LockType,Options
  Source
  Recordset对象可以通过Source属性来连接Command对象。Source参数可以是一个Command对象名称、一段SQL命令、一个指定的数据表名称或是一个Stored Procedure。假如省略这个参数,系统则采用Recordset对象的Source属性。
  ActiveConnection
  Recordset对象可以通过ActiveConnection属性来连接Connection对象。这里的ActiveConnection可以是一个Connection对象或是一串包含数据库连接信息(ConnectionString)的字符串参数。
  CursorType
  Recordset对象Open方法的CursorType参数表示将以什么样的游标类型启动数据,包括adOpenForwardOnly、adOpenKeyset、adOpenDynamic及adOpenStatic,分述如下:
  --------------------------------------------------------------
  常数 常数值 说明
  -------------------------------------------------------------
  adOpenForwardOnly 0 缺省值,启动一个只能向前移动的游标(Forward Only)。
  adOpenKeyset 1 启动一个Keyset类型的游标。
  adOpenDynamic 2 启动一个Dynamic类型的游标。
  adOpenStatic 3 启动一个Static类型的游标。
  -------------------------------------------------------------
  以上几个游标类型将直接影响到Recordset对象所有的属性和方法,以下列表说明他们之间的区别。
  -------------------------------------------------------------
  Recordset属性 adOpenForwardOnly adOpenKeyset adOpenDynamic adOpenStatic
  -------------------------------------------------------------
  AbsolutePage 不支持 不支持 可读写 可读写
  AbsolutePosition 不支持 不支持 可读写 可读写
  ActiveConnection 可读写 可读写 可读写 可读写
  BOF 只读 只读 只读 只读
  Bookmark 不支持 不支持 可读写 可读写
  CacheSize 可读写 可读写 可读写 可读写
  CursorLocation 可读写 可读写 可读写 可读写
  CursorType 可读写 可读写 可读写 可读写
  EditMode 只读 只读 只读 只读
  EOF 只读 只读 只读 只读
  Filter 可读写 可读写 可读写 可读写
  LockType 可读写 可读写 可读写 可读写
  MarshalOptions 可读写 可读写 可读写 可读写
  MaxRecords 可读写 可读写 可读写 可读写
  PageCount 不支持 不支持 只读 只读
  PageSize 可读写 可读写 可读写 可读写
  RecordCount 不支持 不支持 只读 只读
  Source 可读写 可读写 可读写 可读写
  State 只读 只读 只读 只读
  Status 只读 只读 只读 只读
  AddNew 支持 支持 支持 支持
  CancelBatch 支持 支持 支持 支持
  CancelUpdate 支持 支持 支持 支持
  Clone 不支持 不支持
  Close 支持 支持 支持 支持
  Delete 支持 支持 支持 支持
  GetRows 支持 支持 支持 支持
  Move 不支持 支持 支持 支持
  MoveFirst 支持 支持 支持 支持
  MoveLast 不支持 支持 支持 支持
  MoveNext 支持 支持 支持 支持
  MovePrevious 不支持 支持 支持 支持
  NextRecordset 支持 支持 支持 支持
  Open 支持 支持 支持 支持
  Requery 支持 支持 支持 支持
  Resync 不支持 不支持 支持 支持
  Supports 支持 支持 支持 支持
  Update 支持 支持 支持 支持
  UpdateBatch 支持 支持 支持 支持
  --------------------------------------------------------------
  其中NextRecordset方法并不适用于Microsoft Access数据库。
  LockType
  Recordset对象Open方法的LockType参数表示要采用的Lock类型,如果忽略这个参数,那么系统会以Recordset对象的LockType属性为预设值。LockType参数包含adLockReadOnly、adLockPrssimistic、adLockOptimistic及adLockBatchOptimistic等,分述如下:
  -------------------------------------------------------------
  常数 常数值 说明
  --------------------------------------------------------------
  adLockReadOnly 1 缺省值,Recordset对象以只读方式启动,无法运行AddNew、Update及Delete等方法
  adLockPrssimistic 2 当数据源正在更新时,系统会暂时锁住其他用户的动作,以保持数据一致性。
  adLockOptimistic 3 当数据源正在更新时,系统并不会锁住其他用户的动作,其他用户可以对数据进行增、删、改的操作。
  adLockBatchOptimistic 4 当数据源正在更新时,其他用户必须将CursorLocation属性改为adUdeClientBatch才能对数据进行增、 删的操作。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值