• Access:数据库操作常见错误


    以前很少用到Access数据库,不过总感觉这些数据库都是大同小异,支持标准SQL语句,但是用起来还是有很多地方的不同。最近做个小网站,觉得用sql server有点大财小用,故打算用Access来做,本以为很简单,一上来的第一个add的操作就出了问题,进而减慢了项目的进度。以下就我个人遇到的问题及其解决方法,希望有错误的地方帮忙指正,

    View Code
    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类型。最终方案:

    View Code
     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语句:

    View Code
    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数据库只是初步了解,有错误指出希望指出。

  • 相关阅读:
    How to set up a Headless Chrome Node.js server in Docker
    ozone chromium headless
    编译 chromium 的老版本
    chrome单元测试 单独编译 chromium的Gtest
    HTTP协议header中Content-Disposition中文文件名乱码
    windows 10 cmd 窗口 不支持中文 中文乱码 默认gbk 需要改为utf8 临时修改:CHCP 65001
    ubuntu查看core dumped的详细错误原因
    Ubuntu18.04 图形界面 切换 命令行
    Headless Chromium
    添加chromium mojom调用
  • 原文地址:https://www.cnblogs.com/ajunForNet/p/2486659.html
Copyright © 2020-2023  润新知