程序现在是通过ADODB方式访问access的数据库,已经开发完成;
现在想将之改造为支持多种数据库(至少access和ms sql server),请问有什么便捷的方法,或者需要注意的事项?
目前发现,并不是所有原先的SQL可以在ms sql server数据库下跑,比如涉及到日期格式的SQL,另外还有一些access的自带函数在SQL中会有不同。如果各位有相关经验,请分享一下,谢谢。
现在想将之改造为支持多种数据库(至少access和ms sql server),请问有什么便捷的方法,或者需要注意的事项?
目前发现,并不是所有原先的SQL可以在ms sql server数据库下跑,比如涉及到日期格式的SQL,另外还有一些access的自带函数在SQL中会有不同。如果各位有相关经验,请分享一下,谢谢。
调用不同数据库提取不同SQL
但如果应用复杂一点如在access中用到动态交叉表之类则比较麻烦,要在sql server中用存储过程来完成。。
首先告诉你,VB不能事先知道他要连接什么数据库,所以你无法用if判断连接字符串(SQL和ACCESS的连接字符串是不同的 )
我告诉你解决的方法:
你添加一个数据库选择界面:这个界面作为启动界面,设置完成后,生成一个TXT文件,把你的设置写进去。
然后主窗体show并加载那个TXT文件,这样工程就知道你用的是什么数据库了
总不能数据库选择界面每次都是启动界面把,这样也太烦了。好只要在模块里添加下面代码(判断那个TXT文件存不存在)
在工程属性里设置启动窗口为Sub Main
Public Sub Main()
Dim fs As New FileSystemObject '加一个引用“microsoft scripting runtime”
If fs.FileExists(App.Path() + "\SetD.txt") Then
Form1.Show
Else
Form2.Show
End If
End Sub
这样的效果就是 第1次启动软件会出现数据库选择,以后启动就直接显示主界面(显示主界面要加载那个TXT文件)
特别是非MS的数据库,SQL语法差别很大的
而且程序要充分利用数据库自身的功能和特点,这一点数据库之间的差别也是很大的......
再放一天,明天结贴
·完全按照标准SQL(如 SQL-97)设计使用数据库,你提到的Access自带函数就属于非标准部分,不能用。
·不使用任何自定义类型、自定义函数、存储过程、触发器等,这些通常不同数据库存在明显差异。
·对于带条件的SQL,一律用 ADODB.Command 对象执行,这样象日期语法之类的问题通过 Parameter 对象 ADO 会自动进行处理。
·Oracle数据库基本上不用考虑通用,它将空字符串 '' 等同与 Null 的怪癖程序中很难对应。
谢谢分享。
前2条没有问题,可以做到。
第3条有点问题,主要在日期格式上,Access是用#标记的,SQL是用',不知道你提到的“通过 Parameter 对象 ADO 会自动进行处理”是怎么一个方式,能否详述?
换成日期类型也一样,你只要给参数对象赋日期值,ADO执行时会自动按照当前数据库的格式拼接 SQL 语句。