access导入MSSQL 后查询表不能正常怎么办
我有一个ACCESS的数据库,里面除了正常的表数据外还有一种在查询里在的表.我现在把这个ACCESS的库转为MSSQL,我采用的是先设置一个ODBC,然后再导入数据的方式,导入的过程一切正常没有报错,那种在查询里面的表也导进去了,但是好象变成了普通的表了(原来它是有和真正的表之间的关系的).而且导入之后程序也不能正常执行了,我也看了就是和那种查询表有关系的地方报错.请问现在我怎么样样才能让程序正常执行.
答案:[一]连接问题(举例)
[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
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);"
里面的数据库名称、数据源、用户、密码根据自己的实际情况改写一下。
由于字数有限制,所以剩下的内容我没有贴出来
请查看 参考资料
其他:SQL SERVER 不支持导入 ACCESS 的表关系,所以关系必定丢失了
上一个:求一段mssql排序的asp代码!
下一个:求一段mssql排序的asp代码!