最近调试一个VC++ Access数据库迁移到SQL Server平台的项目,遇到了一些问题,经过几天努力,通过论坛发帖子和资料查找,最后终于找到了问题所在,并顺利解决了问题,下面是一些总结,希望对碰到类似问题的朋友能有所帮助。
VC++使用ADO访问SQL Server数据库与访问Access数据库除了在连接字符串上不同之外,其不同之处主要体现在变量定义和SQL语法上。
1、 变量定义:
与ADO有关,或者说与ADO封装的OLE DB类有关,在VC++中(其他使用ADO接口(OLE DB)相关的语言,如C#,VB也是一样),Access的变量定义使用”@”加变量名,而SQL Server使用”?”,如:
Access中:
_bstr_t Sql(“Select a,b from tb where b=@var”);
而在SQL Server中则应改为:
_bstr_t Sql(“Select a,b from tb where b=?”);
否则使用AfxMessageBox捕获异常会出现”必须声明标量变量@var”。该错误比较隐蔽。
捕捉异常的方法:
2、 语法差异:
在语法这一层上,就与ADO无关了。其差别主要有:
1) 位操作:
比如:1、日期分隔符号,在access:英镑符(#),而sql server:是(’)
字符串连接:access中为(&)而sql server:为(+),其他的还有通配符、索引操作、标识列定义等等,更详细的内容可以参见:
Access与SQL Server的SQ语法差异:位操作,链接:
http://hi.baidu.com/iadmireu/blog/item/70f797df754b6c3d5982dd94.html
2) 函数和条件语句:
如时间函数,Access中的now()对应SQL Server中的getdate()函数;条件判断函数,Access中iif()函数对应SQL Server中的case when…,更详细的内容请参见相应的联机帮助。
3) 除零问题:
Access在除数为零时会丢弃相应记录,但不会报错,而SQL Server会自动报错并终止查询。
4) 操作语句:
比较典型的是记录删除语句,在Access中用的是delete * from table,而SQL Server用的是delete from table。
上面的只是较为常见的不完全总结。