用Asp.net操作Access的几点心得

       现在存在很多企业级的数据库,如Oracle,SqlServer等等,功能强大,使用方便,唯一的缺点是 占用资源多,一般情况下,应该把一台计算机作为单独的数据库服务器,这不是所有人都能做到的。如果把应用程序,数据库装在同一台计算机,效率会低一些的。
       那么使用简单的数据库工具可以解决这个问题,当然也可以使用其它解决方案,如xml文件,不过这里只讨论常见的数据库工具-Access。

    本人使用Access的原因,基于处理一下问题:
     服务器管理用户状态,使用web.config设置,存在3种方式:
<SessionState>
  mode="Off":关闭用户Session管理;
  mode="InProc":IIS管理用户Session;
  mode="StateServer":可以在其它运行AspState Service的Win2000机器上管理;
  mode="SqlServer":使用SqlServer数据库管理;

       如果要维护用户状态,那么最后3种方式可以使用,不论是“InProc”还是“StateServer”,都要占用系统资源,对于少量信息维护,可以胜任,对于大量数据维护,“InProc”方式力不从心,“StateServer”方式的扩展性不好。

      用数据库方式,可以管理海量数据,扩展性好,唯一不足是速度比其他稍慢。
      微软提供了使用SqlServer管理Session的方法,前台将web.config的SessionState中的mode设为“SqlSerer”,后台的数据库脚本在/windows/Microsoft.NET\Framework\v1.0.3215\installsqlsate.sql获得,2者配合,可以使用。

        不过不是所有人都使用SqlServer的,对于其他数据库,微软没有提供解决方法。微软的数据库脚本文件,我没有仔细看,因为对SqlServer不熟悉。
        根据对Session的理解,自己写管理方法,数据库为常见的Access。

使用Access后,总结几点经验:
1.虽然Access小巧,但是使用起来比操作大型数据库,如Oracle, 麻烦的多,因为小巧的缘故吧。
2.Access的表中少用Date型字段,因为使用Asp.net 不好操作,没有找到对应的数据类型,解决办法是改为字符型的,然后使用CDate()作转换。
3.Access中可以使用存储过程(即查询) ,没有触发器;

关于使用查询:
使用的方法,同调用Oracle等大型数据库的存储过程相同,如:

//Con是OleDbConnection实例
if(Con.State==ConnectionState.Closed)
                
{
                    Con.Open();
                }

                OleDbCommand Cmd
=Con.CreateCommand();
                Cmd.CommandType
=CommandType.StoredProcedure;
                Cmd.CommandText
="CheckTimeout";                //CheckTimeout是视图名
                

                
int count=Cmd.ExecuteNonQuery();

其中视图CheckTimeout的代码:

UPDATE UserSession SET UserSession.IfEndSession = 1
WHERE (((Now()-CDate([timeout]))>Minute(15)));

属于没有参数的,如果调用有参数的,Asp.Net 部分加入OleDbParameter,其他相同,
视图的代码可为:

PARAMETERS [PersonID] Short;
DELETE *
FROM PersonInfo
WHERE [PersonInfo].[PersonID]=[PersonID];

其中PersonId为参数。

还在测试Session管理的代码,如果基本可用,将贴出来供大家讨论。
Microsoft的产品,入手简单,深入复杂,支持外部的简单的是后台严谨的复杂,我们常在开发Asp.Net程序时使用Session,但是知道Ms怎样处理Session的原理,恐怕知道的人不多,自己写一个Session处理,帮助自己理解Session。
 如果一个系统中存在多个Web服务器,那么有一台服务器作为Session服务器,应该是分布式系统的一个好的选择。
我想把我的想法作为一个开源项目,对此感兴趣的所有人都可以阅读,测试,为了方便测试,选择了Access,如果此项目可用,那么可以容易的应用到其他数据库平台。
有了大家的帮助,我们可以进步更快。

关于数据库分类的概念,谢谢春鱼。

附Access的介绍(从其他网站摘录):

在办公软件Office套件中,最为广大用户熟悉的是Word和Excel,因为它们功能强大且方便易用,更因为它们不仅可用于办公,还可用于个人写作和家庭记帐理财等。同为Office套件中一部分的Access,虽然有着同样强大的功能,但使用的人却相对少些,不像Word和Excel那样广泛。事实上,真正用过Access的用户,对其强大功能和灵活应用均称赞“不错,很好的……。”

  Access 数据库管理系统是Microsoft Office 套件的重要组成部分,是Access的最新版本,可在Windows 95环境下运行。Access适用于小型商务活动,用以存贮和管理商务活动所需要的数据。Access不仅是一个数据库,而且它具有强大的数据管理功能,它可以方便地利用各种数据源,生成窗体(表单),查询,报表和应用程序等。

什么是Access 数据库

  数据库是有结构的数据集合,它与一般的数据文件不同,(其中的数据是无结构的)是一串文字或数字流。数据库中的数据可以是文字、图象、声音等。

Microsoft Access是一种关系式数据库,关系式数据库由一系列表组成,表又由一系列行和列组成,每一行是一个记录,每一列是一个字段,每个字段有一个字段名,字段名在一个表中不能重复。图1是一个“产品”表的例子。“产品”表由10个记录组成,一个记录占一行,每一个记录由产品ID、产品名称、库存量、订货量、单价和折扣率6个字段组成。“产品ID”是字段名,其下面的1,2等是字段的值。
  

表与表之间可以建立关系(或称关联,连接),以便查询相关联的信息。Access数据库以文件形式保存,文件的扩展名是MDB。

Access 的6种对象

   Access 数据库由六种对象组成,它们是表、查询、窗体、报表、宏和模块。

 表(Table) ——表是数据库的基本对象,是创建其他5种对象的基础。表由记录组成,记录由字段组成,表用来存贮数据库的数据,故又称数据表。
  查询(Query)——查询可以按索引快速查找到需要的记录,按要求筛选记录并能连接若干个表的字段组成新表。
  窗体(Form)——窗体提供了一种方便的浏览、输入及更改数据的窗口。还可以创建子窗体显示相关联的表的内容。窗体也称表单。
  报表(Report)——报表的功能是将数据库中的数据分类汇总,然后打印出来,以便分析。
  宏(Macro)——宏相当于DOS中的批处理,用来自动执行一系列操作。Access列出了一些常用的操作供用户选择,使用起来十分方便。
  模块(Module)——模块的功能与宏类似,但它定义的操作比宏更精细和复杂,用户可以根据自己的需要编写程序。模块使用Visual Basic编程。
  与Access 以前的版本比较,Access 新增了许多功能,字段类型增加了OLE对象和超级链接,特别是与Internet的融合,在数据库中可以直接链接到指定的Web页面或网络文件,也可以把Web页面上的表格导入到数据库。Access 可以方便地利用各种数据源,包括dBASE, FoxBase,FoxPro,Excel,Word 等。Access 增加了数据库访问的安全机制,可对表一级设置访问许可权。Access 还可以方便地利用FoxPro数据库、Excel电子表格的数据,还可以和Word混合使用,打印通用信函或信封。

 MS ACCESS使用VBA語法來開發,在mdb的檔案格式中,提供資料與程式同時建置,或是利用資料庫分割,將程式與資料分隔,有


點類似主從架構,使用mdb最大的好處就是可以盡情使用ACCESS的參數,它可以節省寫SQL語法與過多的VBA程式,不過mdb的缺點


是比較適合單機作業,如果想多人使用資料庫,那麼就必須將資料轉換為SQL存取,只要分別在使用端設定ODBC來指向SQL SERVER


,這樣子就符合多人使用的目的與效果了!


         在ACCESS 2000/XP中出現新的格式-ADP,ADP是直接連取SQL SERVER來做資料存取,速度當然比透過ODBC來的快,不過您必


須逐行撰寫 VBA與 SQL語法,在ACCESS 2000中必須安裝OFFICE 2000 SP1更新檔才可以直接存取SQL 2000,無論是MDB或ADP也


好,ACCESS最大的優點在於報表的製作,例如:做識別證,來賓證等,它簡單的報表設定,都是最具有親合力的作,ACCESS的報表當


然也具有試算的能力,只要懂一點ACCESS的使用著都會自己調整報表列印位置,不必依賴程式設計者,給予使用者莫大的幫助

        浏览器访问WebPage时,虽然使用的地址不变,但是端口会发生变化,用刷新页面作测试,2分钟内刷新,用户的端口不变,超过2分钟,那么端口会发生变化。
        Http1.1中说,Connection报头中有持久性连接控制,默认情况下,所有Http1.1连接都认为是持久性的,除非某个请求或者响应包括了一个Connection:close报头。这个持久性,指的好像不是维持相同的Tcp端口。
        如果用Http协议维持会话,那么需要给客户端发送标记符SessionId,客户端再次访问时,提供这个标记,好被Server识别。这个标记存在形式是cookie或者查询字符串,要手工处理Session,需要一些功能来实现,带来如下问题:
        要实现Access存储Session,那么WebApp的配置文件的
<SessionState>
  mode="Off":关闭用户Session管理;
因为不了解IIS的Session管理机制。
那就需要知道怎样处理标记用户请求的SessionID,关于SessionId还在查资料,那位对此有经验,请给与支持。

SessionID:msdn中说,是长度为120Bit的ASC字符,可以在Url中使用,但是经过测试,
//生成SessionId
string id=Session.SessionID;
//显示Id的内容及长度
Response.Write(id+":"+id.Length.ToString()+"<br>");
byte[] by=System.Text.Encoding.ASCII.GetBytes(id);
Response.Write(by.Length.ToString()
+"<br>");

使用Session.SessionID生成的SessionId长度为24个ASC字符,即192Bit,应该是原始的SessionID被加密了,长度发生了变化。
Google

posted on 2005-07-06 14:56  Pierce  阅读(6517)  评论(8)    收藏  举报

导航