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

2008-02-23 05:40:04来源:互联网 阅读 ()

新老客户大回馈,云服务器低至5折

现在,基于数据库服务器的桌面管理程式和Web程式已有太多的应用了,尤其是网络的大量普及,孤立地数据库管理系统无法胜任分布式管理应用,但是面对基于Access数据库的现有的桌面应用我们也无法完全的摒弃。我们利用.Net 远程处理功能将连接和存取Access的行为封装为一个远程对象,供网络中其他客户端通过调用该远程对象来存取实际的Access数据库。我们以 C# 2005 为研发语言来实现上述功能。

  一、 技术要点

  我们都知道Windows应用程式在运行时会启动一个进程,其总包括若干线程,不同的进程之间通信是研发分布式应用程式所必需的,传统上,这不但需要深入了解通信流两端上进程的对象,而且还要深入了解低级别协议的宿主、应用程式编程接口连同配置工具等。总之,他是一项需要大量专业知识和经验的复杂任务。

  幸好.Net为我们提供了远程处理功能,他所提供的通信方法能够快速而方便地完成上述建立通信的任务。因此,无论是需要快速研发 Web 应用程式,还是要花费更多时间生成关键的企业范围的应用程式,.NET Framework 都会提供支持。通过 .NET 远程处理,客户端应用程式能够使用同一台电脑或其网络中其他任何可用的电脑上的其他进程中的对象。

  要使用 .NET 远程处理创建能够让两个对象跨越应用程式直接通信的应用程式,只需生成以下对象即可:

  1、 可远程处理的对象。

  2、 侦听对该远程对象的请求的应用程式即服务器程式。

  3、 对该远程对象发出请求的客户端应用程式。

  .Net下不同应用程式中的对象的通信方式有两种:一种是跨应用程式域边界传输对象副本,一种是使用代理交换消息。MarshalByRefObject 是通过使用代理交换消息来进行通信的对象的基类。当跨应用程式使用远程对象时,对象的基类必须是从 MarshalByRefObject 继承。

  二、 程式实现

  (1)我们先在VS的IDE中创建名为“TestRemoteAccess”的新的解决方案来容纳前述用来实现远程处理的三个项目,首先向解决方案中添加名为“RemoteObject”的类库,然后将默认创建的类名更改为“CRemoteAccess”,并且继承于“MarshalByRefObject”,代码如下:

using System;
using System.Collections.Generic;
using System.Text;

namespace RemoteObject
{
 public class CRemoteAccess : MarshalByRefObject
 {}
}


  我们需要在该对象内创建用于连接和存取本地Access数据库的任何函数,供服务端客户端程式同时调用。用于连接和存取Access数据库的方法这里不再详述,参看附件源码。

  首先任何需要向客户端公开的函数其可见性都必须设为 public。变量m_ConnString需要配置为public static,目的是当客户端调用了SetRemoteAccessConnString后将数据库连接字符串保存下来以备在本次连接期间始终能够访问,代码如下:

……
public static string m_ConnString;
……
public void SetRemoteAccessConnString(string Connstr)
{
 m_ConnString = Connstr;
}
……

  成功连接了Access数据库后我们需要返回数据集给请求的客户端进行显示和编辑,在远程对象中我们声明了几个相关函数:

private void LoadData(string SqlStr, string TableName)
public void SaveData(DataTable ClientDataTable)
public DataTable GetUserTable(string SqlStr, string TableName)

  客户端能够传递SQL查询脚本通过调用 GetUserTable来获取相关数据库表的数据,并返回一个DataTable,然后能够将该DataTable附值给DataGridView以便将数据显示出来。GetUserTable通过调用私有的LoadData 函数来完成对数据的获取。SaveData函数用于将编辑过的数据集保存回本地Access数据库文档,代码如下:

……
m_connection.Open();
m_adapter.Update(ClientDataTable);
……

  (2)远程对象创建完成,我们需要创建用于侦听该远程对象请求的服务端应用程式。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为:“TestServer”,从工具箱中拖拽下几个组件,界面如下所示:

点击放大此图片


  服务器程式TestServer除了具备远程访问对象的能力外,他最主要的作用就是获取实际的Access数据库文档路径,并且配置远程对象的数据库连接字符串。我们必须添加远程对象连同远程处理和网络通讯协议等的类库的引用。在服务器程式启动初始,需要创建远程对象的实例连同注册通信端口,然后调用RemotingConfiguration.RegisterWellKnownServiceType 方法,MSDN中关于该方法的描述是这样的:通过使用给定的参数初始化 WellKnownServiceTypeEntry 的新实例,将服务端上的对象 Type 注册为已知类型,任何知道已注册已知对象的 URI 的客户都能够获取该对象的代理。所谓URI即统一资源标识符 (Uniform Resource Identifier)。代码如下:

……
remotableObject = new RemoteObject.CRemoteAccess();
TcpChannel channel = new TcpChannel(8080);
ChannelServices.RegisterChannel(channel);
RemotingConfiguration.RegisterWellKnownServiceType(typeof(RemoteObject.CRemoteAccess), "RithiaTestAccessServer", WellKnownObjectMode.Singleton);
……

标签:

版权申明:本站文章部分自网络,如有侵权,请联系:west999com@outlook.com
特别注意:本站所有转载文章言论不代表本站观点,本站所提供的摄影照片,插画,设计作品,如需使用,请与原作者联系,版权归原作者所有

上一篇: 网友原创:从N层到.NET周详剖析原理

下一篇: 利用C#远程存取Access数据库[2]