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嵌套方案(特别是当数据量大的时候),也是我下面将要讲解的。 如下图所示:假设有些滚动信息需要分页显示,则我们可以这样处理

2011031318355854.gif

 

 

 

 

 

 

 

 

 

 

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];

 

        }


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去查询设计里面执行下,就会弹出那个错误提示。所以要修改下上面的代码如下:
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 结果排序全部混乱了。
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用户,勾选"完全控制".


相关文章
|
5月前
|
数据库
如何在web.config文件中配置连接Access数据库?
如何在web.config文件中配置连接Access数据库?
34 0
|
1月前
|
SQL 存储 数据可视化
access sql 数据库,Access SQL
access sql 数据库,Access SQL
|
2月前
|
Java 数据库连接 数据库
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
Windows7 64位 连接Access数据库“未发现数据源名称并且未指定默认驱动程序“的解决办法
|
2月前
|
开发框架 安全 .NET
某教程学习笔记(一):07、数据库漏洞(access注入)
某教程学习笔记(一):07、数据库漏洞(access注入)
18 0
|
10月前
|
SQL 数据库连接 数据库
在VS2013平台下,用VB.net 连接Access数据库
从开始学习计算机,我们使用的一直是SQL数据库。这次接触了Access数据库,我将从Access创建到连接向大家分享一下我在Access数据库中的收获。
203 0
|
11月前
|
SQL 安全 Oracle
MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解
MySQL&SQL server&Oracle&Access&PostgreSQL数据库sql注入详解
301 0
|
IDE 数据库连接 数据库
基于MFC和Access数据库实现的学生学习成绩信息管理系统
基于MFC和Access数据库实现的学生学习成绩信息管理系统
209 0
基于MFC和Access数据库实现的学生学习成绩信息管理系统
|
SQL 存储 开发框架
某教程学习笔记(一):07、数据库漏洞(access注入)
某教程学习笔记(一):07、数据库漏洞(access注入)
75 0
某教程学习笔记(一):07、数据库漏洞(access注入)
|
Oracle 关系型数据库 Unix
启动Oracle数据库报错ORA-48173、ORA-48187、OSD-00002、OS-Error (OS 5) Access is denied
启动Oracle数据库报错ORA-48173、ORA-48187、OSD-00002、OS-Error (OS 5) Access is denied
175 0
|
SQL 存储 Oracle
Java连接Access数据库改成MySQL连接数据库
升级诉求:Java连接Access已经算是过时的产物了,一般作为存储服务的应用在Java界比较常用的还是MySQL, 当然还有Oracle数据库。这里要讲的就是连接MySQL数据库了。 就是因为有了SQL标准,各大厂商实现SQL语句基本上大同小异, 所以我们从Access平稳的切换到MySQL数据库也比较方便快捷, 那如何进行Access数据库切换成MySQL数据呢? 下文就是指导手册了,如有问题可以联系作者一同探讨哟~
196 1
Java连接Access数据库改成MySQL连接数据库