关于Access数据库操作常见错误
以前很少⽤到Access数据库,不过总感觉这些数据库都是⼤同⼩异,⽀持标准SQL语句,但是⽤起来还是有很多地⽅的不同。最近做个⼩⽹站,觉得⽤sql server有点⼤财⼩⽤,故打算⽤Access来做,本以为很简单,⼀上来的第⼀个add的操作就出了问题,进⽽减慢了项⽬的进度。以下就我个⼈遇到的问题及其解决⽅法,希望有错误的地⽅帮忙指正,谢谢!
常见错误⼀:“标准表达式中数据类型不匹配”
这是操作Access数据库最常见的错误,我们处理sql语句⼀般都是⽤参数来出来,问题就是出在这⾥,⽐如下⾯的语句:
1string sql = "insert into NewsComment(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails)
values(NC_NewsID,NC_UserName,NC_PostTime,NC_PostDetails)";access数据库生成网页版
2        OleDbParameter[] param = new OleDbParameter[]{
3new OleDbParameter("@NC_NewsID",comment.NC_NewsID),
4new OleDbParameter("@NC_UserName",comment.NC_UserName),
5new OleDbParameter("@NC_PostTime",comment.NC_PostTime),
6new OleDbParameter("@NC_PostDetails",comment.NC_PostDetails),
7        };
运⾏就会出现上述错误,出现这种错误的原因是SQL可以智能的解析出int,string,datetime等数据类型,但是Access之后按照⼀种类型解析,当有int与string⼀起解析时,会将int解析为string类型故会出现这个错误,知道问题就好解决。
1string sql = "insert into
NewsComment(NC_NewsID,NC_UserName,NC_UserEmail,NC_UserSite,NC_PostTime,NC_PostDetails,NC_IsReply,NC_ReplyCommentID,NC_IsDispla y)
values(@NC_NewsID,@NC_UserName,@NC_UserEmail,@NC_UserSite,@NC_PostTime,@NC_PostDetails,@NC_IsReply,@NC_ReplyCommentID,@N C_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;
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;
当Rebuild时还是出现了同样的错误,我纠结了,⼜开始⼀个参数⼀个参数的检查,最后才明⽩过来,问题出在DateTime类型上,当参数有DateTime类型时,我们指定为 OleDbType.DBTimeStamp类型,但是参数的Value确是DateTime类型时间,当向数据库中插⼊时间类型要以'2012/05/06'的形式插⼊,故我们要将参数的value转换成string类型。最终⽅案:
string sql = "insert into
NewsComment(NC_NewsID,NC_UserName,NC_UserEmail,NC_UserSite,NC_PostTime,NC_PostDetails,NC_IsReply,NC_ReplyCommentID,NC_IsDispla y)
values(@NC_NewsID,@NC_UserName,@NC_UserEmail,@NC_UserSite,@NC_PostTime,@NC_PostDetails,@NC_IsReply,@NC_ReplyCommentID,@N C_IsDisplay) ";
OleDbParameter[] param = new OleDbParameter[9];
param[0] = new OleDbParameter("@NC_NewsID", OleDbType.Integer);
param[0].Value = comment.NC_NewsID;
param[1] = new OleDbParameter("@NC_UserName", OleDbType.VarChar, 50);
param[1].Value = comment.NC_UserName;
param[2] = new OleDbParameter("@NC_UserEmail", OleDbType.VarChar, 200);
param[2].Value = comment.NC_UserEmail;
param[3] = new OleDbParameter("@NC_UserSite", OleDbType.VarChar, 200);
param[3].Value = comment.NC_UserSite;
param[4] = new OleDbParameter("@NC_PostTime", OleDbType.DBTimeStamp);
param[4].Value=comment.NC_PostTime.ToString();
param[5] = new OleDbParameter("@NC_PostDetails", OleDbType.LongVarChar, 500);
param[5].Value = comment.NC_PostDetails;
param[6] = new OleDbParameter("@NC_IsReply", OleDbType.Boolean);
param[6].Value = comment.NC_IsReply;
param[7] = new OleDbParameter("@NC_ReplyCommentID", OleDbType.Integer);
param[7].Value=comment.NC_ReplyCommentID;
param[8] = new OleDbParameter("@NC_IsDisplay",OleDbType.Boolean);
param[8].Value = comment.NC_IsDisplay;
编译通过,OK。
常见错误⼆:SELECT ⼦句中包含⼀个保留字、拼写错误或丢失的参数,或标点符号不正确
出现这个错误的原因⼀是执⾏含有top @page这样参数的sql语句:
1string 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;
出现上述错误原因⼆是执⾏Select top 0 from这样的语句会报错,这个很好解决,就是top后跟的参数做判断不能⼩于1。
对于Access数据库只是初步了解,有错误指出希望指出。