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

        }
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用户,勾选"完全控制".

时间: 2024-09-11 20:51:49

Access数据库问题锦集的相关文章

强烈推荐:SQL Server数据库操作实用技巧锦集

server|sql|技巧|数据|数据库 本文主要概括安装时提示有挂起的操作.收缩数据库.压缩数据库.转移数据库给新用户以已存在用户权限.检查备份集.修复数据库等操作技巧. 1.挂起操作 在安装SQL或SP补丁的时候系统提示之前有挂起的安装操作,要求重启,这里往往重启无用,解决办法: 到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\Session Manager删除PendingFileRenameOperations. 2.收缩数据库

怎样在PHP中通过ADO调用Access数据库和COM程序

access|ado|程序|数据|数据库 PHP4已经支持Microsoft的COM技术.然而文档中在COM部分却提得很少. 这儿是几个我试过的例子.希望这些给你一些概念.注意的是这些只能运行在32位的Microsoft Windows平台下. 用php激活ADO ADO是Microsoft的数据库对象技术.ADO里面包括连接数据库的对象,从查询语句中返回数据的记录集对象和表现数据元素的字段对象. 许多数据库不直接支持ADO.代之的是很多数据库支持低两级的Microsoft数据库技术:ODBC和

如何使用c#操作ACCESS数据库

  如何使用c#操作ACCESS数据库: 手头没有Microsoft Access,如何建立数据库,一切依然简单. 首先引用C:Program FilesCommon FilesSystemadomsadox.dll,该DLL包含ADOX命名空间; 接着引用C:Program FilesCommon FilesSystemadomsjro.dll,该DLL包含JRO命名空间 SxS好问提示:如,导入dll不成功,手动把com组件导入为 .net组件,在用vs.net工具导入 using Syst

使用c#操作ACCESS数据库

  手头没有Microsoft Access,如何建立数据库,一切依然简单. 首先引用C:Program FilesCommon FilesSystemadomsadox.dll,该DLL包含ADOX命名空间; 接着引用C:Program FilesCommon FilesSystemadomsjro.dll,该DLL包含JRO命名空间 SxS好问提示:如,导入dll不成功,手动把com组件导入为 .net组件,在用vs.net工具导入 using System; using System.IO

利用C#远程存取Access数据库

目前,基于数据库服务器的桌面管理程序和Web程序已经有太多的应用了,尤其是网络的大量普及,孤立地数据库管理系统无法胜任分布式管理应用,但是面对基于Access数据库的现有的桌面应用我们也无法完全的摒弃. 我们利用.Net 远程处理功能将连接和存取Access的行为封装为一个远程对象,供网络中其它客户端通过调用该远程对象来存取实际的Access数据库.我们以 C# 2005 为开发语言来实现上述功能. 一.技术要点 我们都知道Windows应用程序在运行时会启动一个进程,其总包括若干线程,不同的进

在VB中兼容非ACCESS数据库的技巧

本文从VB数据库体系结构的角度出发,结合一个具体实例,阐述了在VB中兼容非ACCESS格式数据库的具体方法和技巧. 关键词:VB.非ACCESS数据库.数据存取对象 一个完整的数据库管理系统(DBMS)应是能兼容市面上各种较流行数据格式的系统,它充分考虑了不同用户的实际要求.鉴于目前市面上有多种数据库格式(如Foxpro.DBase.Paradox等)流行,因而在VB数据库应用程序中兼容非ACCESS数据库就显得尤为重要了. 作为一种流行的开发平台,VB提供了强大的数据库功能.主要有以下三种:数

适用初学者的JSP连接Access数据库代码

js|初学|access|数据库 适用初学者的JSP连接Access数据库代码,刚刚写的一个Java Web 中连接Access数据库的代码.这些天讲到数据库操作,但是我的本子是XP home版,安装SQL Server比较麻烦,干脆弄个ACCESS来演示好了.有时小型桌面数据库还是蛮实用的嘛,哈-复制内容到剪贴板代码:<%@ page contentType="text/html; charset=GB18030" %><%@page import="ja

Access数据库和项目之间的数据类型的比较或映射

下表比较了 Microsoft Access 数据库 (Microsoft Access 数据库:数据和对象(如表.查询或窗体)组成的集合,与特定的主题或用途有关.Microsoft Jet 数据库引擎用于管理数据.)和 Microsoft Access 项目 (Microsoft Access 项目:与 Microsoft SQL Server 数据库连接且用于创建客户/服务饔τ贸绦虻?Access 文件.项目文件中不包含任何数据或基于数据定义的对象(如表或视图).)的数据类型 (数据类型:决

SQL Server连接ACCESS数据库的实现

access|server|数据|数据库   SQL Server连接ACCESS数据库的实现   作者:  CCBZZP          不同数据库平台的互连一般称之为数据库的异构服务,现在各大数据库之间都可以实现这样的异构互连,只是各厂商的具体实现技术不一样,如:在SQL SERVER里面叫做LINKED SERVER,通过ODBC实现与其它数据库的互联.   本文的测试环境为: 操作系统:  WINDOWS2000 SERVER (繁体系统) 安装数据库: SQLSERVER2000(英