zoukankan      html  css  js  c++  java
  • Access数据库问题锦集

    很少采用Access做数据库开发,前段时间,朋友接了一个小单,让我帮忙做后台开发,采用Access + Asp.Net开发,结果在开发过程使用Access碰到不少问题,所以把这些问题总结一下,希望对其它人有些帮助

    1: Access 分页脚本问题

    使用Access作为数据库开发系统时,页面数据分页的方案有好几种:

        1.1  使用DataGridView自带的分页功能.

        1.2.  使用SELECT TOP  NOT IN 来实现。类似如下所示:

     

    SELECT TOP 100

    [ID] ,

    [Message] ,

    [CreateDate]

    FROM ScrollMessage

    WHERE ID NOT IN ( SELECT TOP 900

    ID

    FROM ScrollMessage

    ORDER BY ID )

    ORDER BY ID
     

         1.3.使用嵌套的TOP结合分页控件AspNetPager来实现

         1.4. 设置一个自增长字段.并且该字段为INDEX.(网上有方案,我没有研究过这种方案)

    其实上面几种方案中,我觉得效率最高的应该是使用TOP嵌套方案(特别是当数据量大的时候),也是我下面将要讲解的。 如下图所示:假设有些滚动信息需要分页显示,则我们可以这样处理

     

     

     

     

     

     

     

     

     

     

    1.1 解决Access 分页,首页或最后一页数据显示错误、混乱问题

     

    /// <summary>

    /// 分页获取滚动消息数据

    /// </summary>

    /// <param name="pageSize">一页显示数据条数</param>

    /// <param name="curPageSize">当前页的数据在所有数据中位置(排序)</param>

    /// <param name="condition">查询条件</param>

    /// <returns>返回当前条件下的滚动消息</returns>

    public DataTable GetScrollMessage(int pageSize, int curPageSize, string condition)

    {

    string cmdText = string.Format(@"SELECT * FROM

    (SELECT TOP {0} * FROM

    (

    SELECT TOP {1} ID, Message,CreateDate

    FROM ScrollMessage

    WHERE 1=1 {2}

    ORDER BY ID DESC

    ) T

    ORDER BY T.ID ASC

    ) TT ORDER BY TT.ID DESC;

    ", pageSize, curPageSize, condition);





    return DbHelper.ExecuteDataSet(cmdText).Tables[0];



    }
    View Code
    private void BindGridView()
    {
    // 当前页数据显示个数
    int pageSize = AspNetPager1.PageSize;

    // AspNetPager 控件中当前显示的页
    int pageIndex = AspNetPager1.CurrentPageIndex;
    int curPageSize = 0;
    MessageMangent module
    = new MessageMangent();

    //设置AspNetPager 的RecordCount属性
    AspNetPager1.RecordCount = module.GetScrollMessageCount("");

    if (pageIndex == AspNetPager1.PageCount)
    {
    pageSize
    = AspNetPager1.RecordCount - (pageIndex - 1) * pageSize;

    if (curPageSize == 0)
    curPageSize
    = AspNetPager1.RecordCount;

    }
    else
    {
    curPageSize
    = pageSize * pageIndex;
    }



    DataTable dtDataSource
    = module.GetScrollMessage(pageSize, curPageSize, "");

    gvMessage.DataSource
    = dtDataSource;
    gvMessage.DataBind();
    }

    上面代码已经能解决分页数据错乱问题,但是其实里面还有个隐藏的bug,就是当数据表没有任何记录时,它会报错:“SELECT 子句中包含一个保留字、拼写错误或丢失的参数,或标点符号不正确”。 可能有些人被这个人弄得莫名其妙,其实主要是TOP 0引起的, 你用SELECT TOP 0 * FROM A去查询设计里面执行下,就会弹出那个错误提示。所以要修改下上面的代码如下:

    View Code
    private void BindGridView()
    {
    // 当前页数据显示个数
    int pageSize = AspNetPager1.PageSize;

    // AspNetPager 控件中当前显示的页
    int pageIndex = AspNetPager1.CurrentPageIndex;
    int curPageSize = 0;
    MessageMangent module
    = new MessageMangent();

    //设置AspNetPager 的RecordCount属性
    AspNetPager1.RecordCount = module.GetScrollMessageCount("");

    if (pageIndex == AspNetPager1.PageCount)
    {
    pageSize
    = AspNetPager1.RecordCount - (pageIndex - 1) * pageSize;

    if (curPageSize == 0)
    curPageSize
    = AspNetPager1.RecordCount;

    }
    else
    {
    curPageSize
    = pageSize * pageIndex;
    }

    if (curPageSize == 0 && pageSize == 0)
    {
    curPageSize
    = 1;
    pageSize
    = 1;
    }


    DataTable dtDataSource
    = module.GetScrollMessage(pageSize, curPageSize, "");

    gvMessage.DataSource
    = dtDataSource;
    gvMessage.DataBind();
    }

    1.2 SELECT TOP 失效问题,比如只需前十条记录,结果它给你查出了所有记录。这主要是查询TOP语句的后面使用Order by,而且Order by字段中有重复值的话,那么这个TOP很会失效而会返回所有记录,所以Order by后面最好用主键字段。我又一次就是犯了这个错误,查询语句如下所示,本来工作好好的,但是由于客户需求,把CreateDate字段从yyyy-MM-dd HH:mm 改成yyyy-MM-dd 结果排序全部混乱了。

    View Code
    string cmdText = string .Format(
    @"SELECT * FROM
    (
    SELECT TOP {0} *
    FROM (
    SELECT TOP {1} * FROM Images I
    INNER JOIN BaseImgPage P ON I.PageID = P.PageID AND I.SubType = P.SubType
    WHERE I.PageID =@PageID AND I.SubType=@SubType
    " + searchCondtion + @"
    ORDER BY CreateDate ASC
    ) ORDER BY CreateDate DESC
    ) ORDER BY ImageSortNum DESC;
    ", pageSize, curpageSize);

    2 关键字问题,像password等,这样网上介绍很多了,想必大家都比较了解。这里就不多说了

    3 错误提示"操作必须使用一个可更新的查询",部署到服务器上,插入或更新数据时,有时会爆出这样的错误

          1.Win 2000/ Win 2003 系统,在数据库文件上(*.mdb)点鼠标右键,选择属性,点安全,查看是否存在everyone用户,如果没有,添加everone用户,勾选"完全控制".

         2.Win XP 系统,打开 data 文件夹,点击“工具”->“文件夹选项”->“查看”,找到“使用简单文件共享(推荐)”这项,把前面的勾去掉。然后在数据库文件上(*.mdb)点鼠标右键,选择属性,点安全,查看是否存在everyone用户,如果没有,添加everone用户,勾选"完全控制".

    扫描上面二维码关注我
    如果你真心觉得文章写得不错,而且对你有所帮助,那就不妨帮忙“推荐"一下,您的“推荐”和”打赏“将是我最大的写作动力!
    本文版权归作者所有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接.
  • 相关阅读:
    混合背包
    庆功会(多重背包)
    商店选址问题(dij)(未完成)
    城市问题(dij)
    最短路径问题(dijkstra)
    城市问题(Floyd)
    商店选址问题(Floyd)
    差值中位数(二分答案+判定中位数)
    CF448C Painting Fence(分治)
    字符串+数论(扩展欧拉定理)
  • 原文地址:https://www.cnblogs.com/kerrycode/p/1982878.html
Copyright © 2011-2022 走看看