ACCESS和SQL语法之ASP比较.docx
- 文档编号:29947511
- 上传时间:2023-08-03
- 格式:DOCX
- 页数:17
- 大小:33.07KB
ACCESS和SQL语法之ASP比较.docx
《ACCESS和SQL语法之ASP比较.docx》由会员分享,可在线阅读,更多相关《ACCESS和SQL语法之ASP比较.docx(17页珍藏版)》请在冰豆网上搜索。
ACCESS和SQL语法之ASP比较
Access与SqlServer之ASP代码比较
后台数据库:
[MicrosoftAccess]
与
[MicrosoftSqlServer]
更换之后,ASP代码应注意要修改的一些地方:
[一]连接问题(举例)
[MicrosoftAccess]
constr="DBQ=c:
\data\clwz.mdb;DRIVER={MicrosoftAccessDriver(*.mdb)}"
[MicrosoftSqlServer]
constr="DRIVER={SQLServer};SERVER=host;DATABASE=mydata;uid=sa;pwd="
[二]相似函数(举例)
[1]DATEDIFF(datepart,startdate,enddate)
其中“datepart”参数可选项如下:
设置描述
————————————
[MicrosoftAccess]
年yyyy
季度q
月m
一年的日数y
日d
一周的日数w
周ww
小时h
分钟n
秒s
[MicrosoftSqlServer]
yearyy,yyyy
quarterqq,q
monthmm,m
dayofyeardy,y
daydd,d
weekwk,ww
hourhh
minutemi,n
secondss,s
millisecondms
-------------------------
基本上差不多,但注意的是在写的时候,
[MicrosoftAccess]要加引号,如:
datediff('d',enddate,'2004/08/01')
[MicrosoftSqlServer]则不需要,如:
datediff(d,enddate,'2004/08/01')
[2][MicrosoftAccess]中可用如cstr等转数据类型函数,而
[MicrosoftSqlServer]中则用convert或cast函数,如:
convert(varchar,[amount])等。
[3][MicrosoftSqlServer]
取当前时间用getdate等等...
[三]语句
[MicrosoftSqlServer]
可以用
CASE
WHENTHEN
WHENTHEN
...
ELSE
END
语句,而
[MicrosoftAccess]
不支持。
[MicrosoftAccess]也不支持between语句
[MicrosoftSqlServer]则可以这样写:
[date]between@date1and@date2
[四]查询表
[MicrosoftSqlServer]
可三个及以上表join查询,而
[MicrosoftAccess]
好像只能两个表联接查询(待权威确认),
而且[MicrosoftSqlServer]可用“*=”和“=*”连接符。
[五]除零问题
[MicrosoftAccess]
在碰到除数为零时,自动丢掉相关记录,而
[MicrosoftSqlServer]
则会报错,且查询中止。
删除代码:
[MicrosoftAccess]
可以这样写:
delete*from[table]
[MicrosoftSQLServer]
只能这样写:
deletefrom[table]
多*会报错
_____________________________________
当前日期:
[MicrosoftAccess]
用date()
[MicrosoftSQLServer]
用getdate()如果数据库可能会更换类型的话,可以
在ASP代码中加上如这样:
ifinStr(constr,"MicrosoftAccess")>0then
sqlstr=[MicrosoftAccess][sql代码]
else
sqlstr=[MicrosoftSqlServer][sql代码]
endif
(constr--连接字符串)
这样即使改了数据库,也不用改数据库查询更新代码了。
再加:
access中有true、false的字段记录,而sql里只有smallint,对应如果在access里有“字段名=true”的,在sql里要改成“字段名=1”
网上大部分的免费asp程序使用的是access数据库。
但是access数据库作为一个中小型的单机数据库系统,在承担访问量、数据量大的网站应用时,往往就不堪重负了。
一般认为,超过50M的access数据库性能就开始明显下降,超过100M以后,出错、运行慢的问题会更加突出。
尽管可以如动网7.0以后那样,从程序的角度尽量优化以图提高性能,但是不能从根本上解决问题。
这时也许使用微软的SQLServer数据库就是最可能的办法,当然也可以使用其它的如Oracle、MySQL等等,但是作为改写来说,由于同为微软的产品,改写成SQLServer应该是最省力的办法。
一、改写前提:
系统已经安装好SQLServer2000并且打上了SP3补丁;安装好Office套件里面的Access;使用一个支持纯文本编辑并且带有行号显示的编辑器,推荐UltraEdit,当然也可以使用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)如果你要用一个ForSQL的程序,里面用到了存储过程,那么你应该有这个程序本身建立SQL数据库的方法:
有其本身的SQL数据库文件,或者sql脚本;如果没有的话,采用导入access数据库的方式是无法建立存储过程的,这样你最好放弃这个ForSQL的程序版本,使用同样版本的ForAccess的程序,导入access数据库,然后用下面的改写方法自己改成SQL版本的程序。
三、连接字符串的改写
可参考动网的这段,分别是针对access和SQL的
DimConnStr
IfIsSqlDataBase=1Then
'sql数据库连接参数:
数据库名、用户密码、用户名、连接名(本地用local,外地用IP)
DimSqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
SqlDatabaseName="dvbbs7"
SqlPassword=""
SqlUsername="dvbbs"
SqlLocalName="(local)"
ConnStr="Provider=Sqloledb;UserID="&SqlUsername&";Password="&SqlPassword&";InitialCatalog="&SqlDatabaseName&";DataSource="&SqlLocalName&";"
Else
'免费用户第一次使用请修改本处数据库地址并相应修改data目录中数据库名称,如将dvbbs6.mdb修改为dvbbs6.asp
'http:
//www.knowsky.com/
Db="data/fengerqingqing.mdb"
ConnStr="Provider=Microsoft.Jet.OLEDB.4.0;DataSource="&Server.MapPath(db)
EndIf
OnErrorResumeNext
Setconn=Server.CreateObject("ADODB.Connection")
conn.openConnStr
当然你使用SQL的话,有关access的使用语句可以删除,就是else后面到onerrorresumenext前面,变成这样:
DimConnStr
'sql数据库连接参数:
数据库名、用户密码、用户名、连接名(本地用local,外地用IP)
DimSqlDatabaseName,SqlPassword,SqlUsername,SqlLocalName
SqlDatabaseName="dvbbs7"
SqlPassword=""
SqlUsername="dvbbs"
SqlLocalName="(local)"
ConnStr="Provider=Sqloledb;UserID="&SqlUsername&";Password="&SqlPassword&";InitialCatalog="&SqlDatabaseName&";DataSource="&SqlLocalName&";"
OnErrorResumeNext
Setconn=Server.CreateObject("ADODB.Connection")
conn.openConnStr
也可以简洁一些,写成这样:
Setconn=Server.CreateObject("ADODB.Connection")
conn.open"Provider=Sqloledb;UserID=sa;Password=1234567;InitialCatalog=dvbbs7;DataSource=(local);"
里面的数据库名称、数据源、用户、密码根据自己的实际情况改写一下。
四、程序的改写
这也有两种情况
1、如果你幸运,拿到的是ForSQL的程序,那么如果上面的数据库建立过程没有遇到麻烦,程序基本上就可以运行了,出错的话,只是程序本身的bug,如何修改不是这个帖子讨论的内容,就不赘述了。
2、大多数情况,程序本身是ForAccess的,与ForSQL的程序差别主要是程序中使用到的SQL查询语句。
注意,SQL查询语句是数据库应用不可缺少的部分,不管是ForSQL还是ForAceess的程序使用的语法大体差不多,但是有一些微妙的差别,正是这些差别,造成了程序的不通用,也是我们需要修改的主要内容。
这样一般要修改的部分如下:
(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(nameisnull)
(4)真假值判断:
access中可以用=true、=false来判断,但是在SQL中就会出错,因此在SQL查询或执行语句中这类判断要分别改成=1、=0。
注意一点:
有些程序虽然写成=“true”,但是由于有引号,所以这个字段是字符类型的,你不能改成=1,保持原样即可。
以上是比较常见的改写的地方,还有一些不太常见,如果遇到了可以在此回帖讨论。
五、程序的调试
前面推荐使用带有行号的编辑器,是因为上述的改写不大可能是直接搜索程序源码来做,很难找全。
我采取的方式一般这样:
数据库改写完成,直接调试程序,出错后,看看出错的提示,找到相应文件的代码行,但是根源往往不是那行,比如出错的语句是:
conn.execute(sql),但是这句本身是没有错的,错误原因是里面的这个sql字符串,那就向上看这个sql字符串是如何生成的,按照上面所说的程序修改办法修改。
数据库导入以后,自动增加字段需要重写,所有的数字类型需要增加长度,最好用decimal。
所有的默认值都丢失了。
主要是数字类型和日期类型。
所有now(),time(),date()要改成getdate()。
所有datediff('d',time1,time2)要改成datediff(day,time1,time2)
有可能一些true/false类型不能使用,要变为1/0。
备注类型要通过cast(columnasvarchar)来使用。
CursorType要改成1,也就是打开数据库时要给出第一个数字参数为1,否则记录可能显示不完整。
isnull(rowname)要改成rowname=null
ACCESS的数据库中的自动编号类型在转化时,sqlserver并没有将它设为自动编号型,我们需在SQL创建语句中加上identity,表示自动编号!
转化时,跟日期有关的字段,SQLSERVER默认为smalldatetime型,我们最好将它变为datetime型,因为datetime型的范围比smalldatetime型大。
有时用smalldatetime型时,转化失败,而用datetime型时,转化成功。
对此两种数据库进行操作的sql语句不全相同,例如:
在对ACCESS数据库进行删除纪录时用:
"delete*fromuserwhereid=10",而对SQLSERVER数据库进行删除是用:
"deleteuserwhereid=10".
日期函数不相同,在对ACCESS数据库处理中,可用date()、time()等函数,但对SQLSERVER数据库处理中,只能用datediff,dateadd等函数,而不能用date()、time()等函数。
在对ACCESS数据库处理中,sql语句中直接可以用一些VB的函数,像cstr()函数,而对SQLSERVER数据库处理中,却不能用。
下表比较了MicrosoftAccess数据库(MicrosoftAccess数据库:
数据和对象(如表、查询或窗体)组成的集合,与特定的主题或用途有关。
MicrosoftJet数据库引擎用于管理数据。
)和MicrosoftAccess项目(MicrosoftAccess项目:
与MicrosoftSQLServer数据库连接且用于创建客户/服务器应用程序的Access文件。
项目文件中不包含任何数据或基于数据定义的对象(如表或视图)。
)的数据类型(数据类型:
决定字段可拥有的数据类型的字段特征。
数据类型包括Boolean、Integer、Long、Currency、Single、Double、Date、String和Variant(默认))。
MicrosoftAccess数据类型SQLServer数据类型
是/否(“是/否”数据类型:
一种字段数据类型,用于只有两种可能值(如是或否、True或False)的字段。
不允许有Null值。
)bit(bit数据类型:
在Access项目中,一种存储值为1或0的数据类型。
接受1和0以外的整数值,但总是将其解释为1。
)
数字(“数字”数据类型:
MicrosoftAccess数据库中的一种字段数据类型,用于将在数学运算中使用的数值数据。
但是,若要显示或计算货币值,则应使用“货币”数据类型。
)(字节)tinyint(tinyint数据类型:
Access项目中的一种占一个字节(8位)的数据类型,用于存储从0到255范围内的整数。
)
数字(整型)smallint(smallint数据类型:
Access项目中的一种2字节(16位)数据类型,存储位于-2^15(-32,768)与2^15-1(32,767)之间的数字。
)
数字(长整型)int(int数据类型:
Access项目中的一种4字节(32位)数据类型,存储位于-2^31(-2,147,483,648)与2^31-1(2,147,483,647)之间的数字。
)
数字(单精度浮点型)real(real数据类型:
在Access项目中,一种近似的数值数据类型,精度为7位,正值取值范围大致从1.18E-38到3.40E+38,负值取值范围大致从-1.18E-38到-3.40E+38,也可以取0。
)
(无等价的数据类型)bigint(bigint数据类型:
Access项目中的一种8字节(64位)数据类型,存储位于-2^63(-9,223,372,036,854,775,808)与2^63-1(9,223,372,036,854,775,807)之间的数字。
)
数字(双精度浮点型)float(float数据类型:
在Access项目中,一种近似的数值数据类型,精度为15位。
它所存储的正值范围大致是从2.23E-308到1.79E+308,负值范围大致是从-2.23E-308到-1.79E+308,也可以为0。
)
货币(“货币”数据类型:
MicrosoftAccess数据库中的一种数据类型,用于与货币有关的计算或其精确度极其重要的定点计算。
)money(money数据类型:
在Access项目中,用于存储货币值的数据类型,取值范围从-922,337,203,685,477.5707到922,337,203,685,477.5807,精确度为万分之一个货币单位。
)
smallmoney(smallmoney数据类型:
Access项目中的一种存储货币值的数据类型,取值范围从-214,748.3648到214,748.3647,精确度为万分之一个货币单位。
当显示smallmoney值时,会将它们四舍五入为两个
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- ACCESS SQL 语法 ASP 比较