• 站点地图
  • 加入收藏
  • 设为首页
  • 中国网管、站长学习园地hspace="5"
    当前位置:IT加速度>>数据库>>Access>>内容阅读
    Access与Sql Server之ASP代码比较
    作者:  来源:  时间:2008-07-09
      导读:

    后台数据库:
    [Microsoft Access]

    [Microsoft Sql Server]
    更换之后,ASP代码应注意要修改的一些地方:
    [一]连接问题(举例)
    [Microsoft Access]
    constr = "DBQ=c:\data\clwz.mdb; DRIVER={Microsoft Access Driver (*.mdb)}"
    [Microsoft Sql Server]
    constr = "DRIVER={SQL Server};SERVER=host;DATABASE=mydata;uid=sa;pwd="

    [二]相似函数(举例)

    [1]DATEDIFF(datepart, startdate, enddate)
    其中“datepart”参数可选项如下:
    设置 描述
    ————————————
    [Microsoft Access]
    年 yyyy
    季度 q
    月 m
    一年的日数 y
    日 d
    一周的日数 w
    周 ww
    小时 h
    分钟 n
    秒 s

    [Microsoft Sql Server]
    year yy, yyyy
    quarter qq, q
    month mm, m
    dayofyear dy, y
    day dd, d
    week wk, ww
    hour hh
    minute mi, n
    second ss, s
    millisecond ms

    -------------------------

    基本上差不多,但注意的是在写的时候,
    [Microsoft Access]要加引号,如:datediff('d',enddate,'2004/08/01')
    [Microsoft Sql Server]则不需要,如:datediff(d,enddate,'2004/08/01')

    [2][Microsoft Access]中可用如cstr等转数据类型函数,而
    [Microsoft Sql Server]中则用convert或cast函数,如:
    convert(varchar,[amount])等。

    [3][Microsoft Sql Server]
    取当前时间用getdate等等...

    [三]语句
    [Microsoft Sql Server]
    可以用
    CASE
    WHEN THEN
    WHEN THEN
    ...
    ELSE
    END
    语句,而
    [Microsoft Access]
    不支持。
    [Microsoft Access]也不支持between语句
    [Microsoft Sql Server]则可以这样写:
    [date] between @date1 and @date2
    [四]查询表
    [Microsoft Sql Server]
    可三个及以上表join查询,而
    [Microsoft Access]
    好像只能两个表联接查询(待权威确认),
    而且[Microsoft Sql Server]可用“*=”和“=*”连接符。[五]除零问题
    [Microsoft Access]
    在碰到除数为零时,自动丢掉相关记录,而
    [Microsoft Sql Server]
    则会报错,且查询中止。删除代码:
    [Microsoft Access]
    可以这样写:delete * from [table]
    [Microsoft SQL Server]
    只能这样写:delete from [table]
    多*会报错
    _____________________________________
    当前日期:
    [Microsoft Access]
    用date()
    [Microsoft SQL Server]
    用getdate()如果数据库可能会更换类型的话,可以
    在ASP代码中加上如这样:
    if inStr(constr,"Microsoft Access") > 0 then
    sqlstr=[Microsoft Access][sql代码]
    else
    sqlstr=[Microsoft Sql Server][sql代码]
    end if
    (constr--连接字符串)
    这样即使改了数据库,也不用改数据库查询更新代码了。
    再加:access中有true、false的字段记录,而sql里只有smallint,对应如果在access里有“字段名=true”的,在sql里要改成“字段名=1”
    网上大部分的免费asp程序使用的是access数据库。但是access数据库作为一个中小型的单机数据库系统,在承担访问量、数据量大的网站应用时,往往就不堪重负了。一般认为,超过50M的access数据库性能就开始明显下降,超过100M以后,出错、运行慢的问题会更加突出。尽管可以如动网7.0以后那样,从程序的角度尽量优化以图提高性能,但是不能从根本上解决问题。
    这时也许使用微软的SQL Server数据库就是最可能的办法,当然也可以使用其它的如Oracle、MySQL等等,但是作为改写来说,由于同为微软的产品,改写成SQL Server应该是最省力的办法。

    一、改写前提:

    系统已经安装好SQL Server2000并且打上了SP3补丁;安装好Office套件里面的Access;使用一个支持纯文本编辑并且带有行号显示的编辑器,推荐Ultra Edit,当然也可以使用FrontPage2003,不过以前的版本行号显示不太好用。

    个人能力要求:会基本的asp语法、access数据库的操作、SQLServer企业管理器的基本操作。

    二、数据库的准备

    一般来说有两种情况:
    1、程序提供了SQL数据库格式:有一个MDF文件,或者提供了创建SQL数据库的SQL脚本文件(后缀名为.sql)。
    如果有mdf文件,可以用企业管理器直接附加上,如果提供的是sql脚本文件,那么就先用企业管理器自己创建一个sql数据库,然后数据库用企业管理器中的查询分析器运行这个脚本创建数据库表。
    这样建立的数据库基本不用再去改写什么了。
    2、更多的是没有提供SQL数据库或脚本文件的,这时,就要自己来做这一切了,这也是我们这个帖子主要解决的问题。一般这样的程序会提供一个access数据库,这样你就用企业管理器导入access数据库,导入后需要改写下面一些东西:
    对照原来的access,改写下面的部分:
    (1)sql数据库表是没有自动字段的,因此原来access中的自动字段被转换成了普通字段,需要手工改成标识类型,增量为1。
    (2)所有的时间字段,如果定义了默认值,那么原来肯定是now(),需要改成getdate()
    (3)原来字段的默认值一般都不会自动引入,需要对照原表的字段手工添加。
    (4)由于数据库的不同,access和sql的字段类型很多转换后就变化了,比如原来的《是否》字段会被转换成bit或者int,备注字段被转换成longtext,text字段转换成varchar等等,一般来说不会影响程序运行,如果有问题,我们在下面的程序改写部分再说。
    (5)如果你要用一个For SQL的程序,里面用到了存储过程,那么你应该有这个程序本身建立SQL数据库的方法:有其本身的SQL数据库文件,或者sql脚本;如果没有的话,采用导入access数据库的方式是无法建立存储过程的,这样你最好放弃这个For SQL的程序版本,使用同样版本的For Access的程序,导入access数据库,然后用下面的改写方法自己改成SQL版本的程序。

    三、连接字符串的改写

    可参考动网的这段,分别是针对access和SQL的
    Dim ConnStr
    If IsSqlDataBase = 1 Then
    'sql数据库连接参数:数据库名、用户密码、用户名、连接名(本地用local,外地用IP)
    Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
    SqlDatabaseName = "dvbbs7"
    SqlPassword = ""
    SqlUsername = "dvbbs"
    SqlLocalName = "(local)"
    ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
    Else
    '免费用户第一次使用请修改本处数据库地址并相应修改data目录中数据库名称,如将dvbbs6.mdb修改为dvbbs6.asp
    'http://www.knowsky.com/
    Db = "data/fengerqingqing.mdb"
    ConnStr = "Provider = Microsoft.Jet.OLEDB.4.0;Data Source = " & Server.MapPath(db)
    End If
    On Error Resume Next
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.open ConnStr

    当然你使用SQL的话,有关access的使用语句可以删除,就是else后面到on error resume next前面,变成这样:

    Dim ConnStr
    'sql数据库连接参数:数据库名、用户密码、用户名、连接名(本地用local,外地用IP)
    Dim SqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
    SqlDatabaseName = "dvbbs7"
    SqlPassword = ""
    SqlUsername = "dvbbs"
    SqlLocalName = "(local)"
    ConnStr = "Provider = Sqloledb; User ID = " & SqlUsername & "; Password = " & SqlPassword & "; Initial Catalog = " & SqlDatabaseName & "; Data Source = " & SqlLocalName & ";"
    On Error Resume Next
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.open ConnStr

    也可以简洁一些,写成这样:
    Set conn = Server.CreateObject("ADODB.Connection")
    conn.open "Provider = Sqloledb; User ID = sa; Password = 1234567; Initial Catalog = dvbbs7; Data Source = (local);"
    里面的数据库名称、数据源、用户、密码根据自己的实际情况改写一下。

    四、程序的改写

    这也有两种情况
    1、如果你幸运,拿到的是For SQL的程序,那么如果上面的数据库建立过程没有遇到麻烦,程序基本上就可以运行了,出错的话,只是程序本身的bug,如何修改不是这个帖子讨论的内容,就不赘述了。
    2、大多数情况,程序本身是For Access的,与For SQL的程序差别主要是程序中使用到的SQL查询语句。注意,SQL查询语句是数据库应用不可缺少的部分,不管是For SQL还是For Aceess的程序使用的语法大体差不多,但是有一些微妙的差别,正是这些差别,造成了程序的不通用,也是我们需要修改的主要内容。这样一般要修改的部分如下:
    (1)时间函数的问题:SQL数据库的时间函数与access不同,最常见的是取现在时间的函数,access是now(),SQL是getdate()。因此凡是在where子句中使用了now()的地方都要改成getdate();注意,now()函数在asp程序本身也要使用,凡是不在数据库查询或执行语句中使用的now()函数千万不要改。
    (2)时间比较函数:datediff('d','时间1',‘时间2’)这是access查询用的格式,SQl中这些引号都要去掉,同时时间格式的前后可能加上了#,这也要去掉。同样这也是指在sql语句中的,在asp语句中的要保持原样。
    (3)空值的表示:在access中,判断空值一般用是否=""来表示,但是这在SQL中往往出错,如果遇到出错的问题或者程序运行不正常,可以改成如这样判断:where (name is null)
    (4)真假值判断:access中可以用=true、=false来判断,但是在SQL中就会出错,因此在SQL查询或执行语句中这类判断要分别改成=1、=0。注意一点:有些程序虽然写成=“true”,但是由于有引号,所以这个字段是字符类型的,你不能改成=1,保持原样即可。

    以上是比较常见的改写的地方,还有一些不太常见,如果遇到了可以在此回帖讨论。

    首页 上一页 下一页 尾页

    责任编辑:it415.com

    上一篇:设定Access数据库自增长字段初始值
    下一篇:Access中的模糊查询
    相关内容