以前很少用到Access数据库,不过总感觉这些数据库都是大同小异,支持标准SQL语句,但是用起来还是有很多地方的不同。最近做个小网站,觉得用sql server有点大财小用,故打算用Access来做,本以为很简单,一上来的第一个add的操作就出了问题,进而减慢了项目的进度。以下就我个人遇到的问题及其解决方法,希望有错误的地方帮忙指正,
1 string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails) values(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails)"; 2 OleDbParameter[] param = new OleDbParameter[]{ 3 new OleDbParameter("@NC_NewsID",comment.NC_NewsID), 4 new OleDbParameter("@NC_UserName",comment.NC_UserName), 5 new OleDbParameter("@NC_PostTime",comment.NC_PostTime), 6 new OleDbParameter("@NC_PostDetails",comment.NC_PostDetails), 7 };
常见错误一:“标准表达式中数据类型不匹配”
这是操作Access数据库最常见的错误,我们处理sql语句一般都是用参数来出来,问题就是出在这里,比如下面的语句:
运行就会出现上述错误,出现这种错误的原因是SQL可以智能的解析出int,string,datetime等数据类型,但是Access之后按照一种类型解析,当有int与string一起解析时,会将int解析为string类型故会出现这个错误,知道问题就好解决。
当Rebuild时还是出现了同样的错误,我纠结了,又开始一个参数一个参数的检查,最后才明白过来,问题出在DateTime类型上,当参数有DateTime类型时,我们指定为 OleDbType.DBTimeStamp类型,但是参数的Value确是DateTime类型时间,当向数据库中插入时间类型要以'2012/05/06'的形式插入,故我们要将参数的value转换成string类型。最终方案:
1 string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_UserEmail,NC_UserSite,NC_PostTime,NC_PostDetails,NC_IsReply,NC_ReplyCommentID,NC_IsDisplay) values(@NC_NewsID,@NC_UserName,@NC_UserEmail,@NC_UserSite,@NC_PostTime,@NC_PostDetails,@NC_IsReply,@NC_ReplyCommentID,@NC_IsDisplay) "; 2 OleDbParameter[] param = new OleDbParameter[9]; 3 param[0] = new OleDbParameter("@NC_NewsID", OleDbType.Integer); 4 param[0].Value = comment.NC_NewsID; 5 param[1] = new OleDbParameter("@NC_UserName", OleDbType.VarChar, 50); 6 param[1].Value = comment.NC_UserName; 7 param[2] = new OleDbParameter("@NC_UserEmail", OleDbType.VarChar, 200); 8 param[2].Value = comment.NC_UserEmail; 9 param[3] = new OleDbParameter("@NC_UserSite", OleDbType.VarChar, 200); 10 param[3].Value = comment.NC_UserSite; 11 param[4] = new OleDbParameter("@NC_PostTime", OleDbType.DBTimeStamp); 12 param[4].Value=comment.NC_PostTime.ToString(); 13 param[5] = new OleDbParameter("@NC_PostDetails", OleDbType.LongVarChar, 500); 14 param[5].Value = comment.NC_PostDetails; 15 param[6] = new OleDbParameter("@NC_IsReply", OleDbType.Boolean); 16 param[6].Value = comment.NC_IsReply; 17 param[7] = new OleDbParameter("@NC_ReplyCommentID", OleDbType.Integer); 18 param[7].Value=comment.NC_ReplyCommentID; 19 param[8] = new OleDbParameter("@NC_IsDisplay",OleDbType.Boolean); 20 param[8].Value = comment.NC_IsDisplay;
编译通过,OK。
常见错误二:SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确
出现这个错误的原因一是执行含有top @page这样参数的sql语句:
1 string sql = "select top @Page T_ID,T_Name from TypeList where T_ParentID =@ParentID order by T_TypeOrder,T_CreateDate asc"; 2 OleDbParameter[] param = new OleDbParameter[2]; 3 param[0] = new OleDbParameter("@Page", OleDbType.Integer); 4 param[0].Value = Page; 5 param[1] = new OleDbParameter("@ParentID", OleDbType.Integer); 6 param[1].Value = ParentID;
这个问题的出现我很纠结,在网上搜过答案,但是没有一个满意的结果,可以参考我上篇博文:http://www.cnblogs.com/aces/archive/2012/04/28/Ace_Access.html 对于这个问题我觉得原因是Top 后面跟@page这样参数造成的,这句在SQL数据库中需要在写成Top (@page) 这样可以build通过。这个错误的解决办法我目前采用的是字符串拼接,希望知道好的解决办法的朋友分享下,小弟感激不尽。
出现上述错误原因二是执行Select top 0 from这样的语句会报错,这个很好解决,就是top后跟的参数做判断不能小于1。
对于Access数据库只是初步了解,有错误指出希望指出。