热门标签 | HotTags
当前位置:  开发笔记 > 数据库 > 正文

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

目前,基于数据库服务器的桌面管理程序和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);
……



  当选择了要进行存取的Access数据库文件后,我们需要调用远程对象的SetRemoteAccessConnString方法,该方法将保存在本次与服务器程序连接期间连接该Access数据库文件的连接字符串,代码如下:


……
ProviderStr = ProviderStrPart + txtAccessMdbFileName.Text + ";Jet OLEDB:Database Password=" + txtAccessPassword.Text;
……
remotableObject.SetRemoteAccessConnString(ProviderStr);
……



  (3)最后我们创建用于连接和请求服务的客户端程序,它会通过调用服务器程序TestServer已经注册的远程对象来获取相关数据集,并将编辑过的数据保存回实际的数据库文件。在“TestRemoteAccess”解决方案中新建一个Windows窗体项目名为:“TestClient”,从工具箱中拖拽下几个组件,界面如下所示:

客户端程序需要知道服务器程序所运行在的计算机名称或IP地址以及侦听的端口号,然后创建远程对象的实例,并且创建DataTable以便接收返回的数据,代码如下:

……
string RemoteURL;
Host = txtHost.Text;
Port = txtPort.Text;
RemoteURL = "tcp://" + Host + ":" + Port + "/RithiaTestAccessServer";
try
{
 TcpChannel chan = new TcpChannel();
 ChannelServices.RegisterChannel(chan);
 remoteObject = (RemoteObject.CRemoteAccess)Activator.GetObject(typeof(RemoteObject.CRemoteAccess), RemoteURL);
 RemoteDataTable = new DataTable();
 button3.Enabled = false;
}
catch (Exception E)
{
 MessageBox.Show(E.Message.ToString());
}
finally
{
}
…… 

  客户端程序根据服务程序所侦听的信道是TCP还是HTTP来注册相应的信道和端口号,并且组合成远程对象的Url,即Url= 信道://主机名:端口号/对象的Uri,然后创建远程对象的实例,就像使用本地对象一样可以对其进行存取,我们可以调用远程对象的GetUserTable方法获取指定查询脚本的结果集,代码如下:

……
RemoteDataTable = remoteObject.GetUserTable(txtSQL.Text, "Test");
dataGridView1.DataSource = RemoteDataTable;
…… 

  保存结果集时仅需简单调用SaveData方法即可,代码如下:

……
remoteObject.SaveData(RemoteDataTable);
…… 

  三、 结果

  该程序成功地在Visual Studio .Net 2005及Windows XP SP2下调试运行通过。
源码下载:http://d.download.csdn.net/down/401452/q520525745
推荐阅读
  • 本文探讨了在SharePoint环境中使用BDC(Business Data Catalog)时遇到的问题及其解决策略,包括XML文件导入SSP后的不可见性问题以及与远程SQL Server 2005连接的难题。 ... [详细]
  • 本文详细介绍了PHP中的几种超全局变量,包括$GLOBAL、$_SERVER、$_POST、$_GET等,并探讨了AJAX的工作原理及其优缺点。通过具体示例,帮助读者更好地理解和应用这些技术。 ... [详细]
  • Windows环境下Oracle数据库迁移实践
    本文详细记录了一次在Windows操作系统下将Oracle数据库的控制文件、数据文件及在线日志文件迁移至外部存储的过程,旨在为后续的集群环境部署做好准备。 ... [详细]
  • Java虚拟机及其发展历程
    Java虚拟机(JVM)是每个Java开发者日常工作中不可或缺的一部分,但其背后的运作机制却往往显得神秘莫测。本文将探讨Java及其虚拟机的发展历程,帮助读者深入了解这一关键技术。 ... [详细]
  • H5技术实现经典游戏《贪吃蛇》
    本文将分享一个使用HTML5技术实现的经典小游戏——《贪吃蛇》。通过H5技术,我们将探讨如何构建这款游戏的两种主要玩法:积分闯关和无尽模式。 ... [详细]
  • 深入解析:存储技术的演变与发展
    本文探讨了从单机文件系统到分布式文件系统的存储技术发展过程,详细解释了各种存储模型及其特点。 ... [详细]
  • Redis:缓存与内存数据库详解
    本文介绍了数据库的基本分类,重点探讨了关系型与非关系型数据库的区别,并详细解析了Redis作为非关系型数据库的特点、工作模式、优点及持久化机制。 ... [详细]
  • 本文详细介绍了在 CentOS 7 系统上安装中文宋体字体的方法,包括操作系统的环境配置、字体管理工具的安装、字体文件的传输与缓存重建等步骤。 ... [详细]
  • 初探Hadoop:第一章概览
    本文深入探讨了《Hadoop》第一章的内容,重点介绍了Hadoop的基本概念及其如何解决大数据处理中的关键挑战。 ... [详细]
  • PHP 图形函数中实现汉字显示的方法
    本文详细介绍了如何在 PHP 的图形函数中正确显示汉字,包括具体的步骤和注意事项,适合初学者和有一定基础的开发者阅读。 ... [详细]
  • 2023年1月28日网络安全热点
    涵盖最新的网络安全动态,包括OpenSSH和WordPress的安全更新、VirtualBox提权漏洞、以及谷歌推出的新证书验证机制等内容。 ... [详细]
  • 本文由公众号【数智物语】(ID: decision_engine)发布,关注获取更多干货。文章探讨了从数据收集到清洗、建模及可视化的全过程,介绍了41款实用工具,旨在帮助数据科学家和分析师提升工作效率。 ... [详细]
  • 本文介绍了如何利用X_CORBA实现远程对象调用,并通过多个示例程序展示了其功能与应用,包括基础的Hello World示例、文件传输工具以及一个完整的聊天系统。 ... [详细]
  • PGXC中的两阶段提交机制及其对事务一致性的保障
    PGXC作为一款基于PostgreSQL的分布式数据库系统,利用Sharding技术将数据分散存储于多个数据库实例中。本文探讨了PGXC的两阶段提交过程及其实现事务强一致性的方法。 ... [详细]
  • 对象存储与块存储、文件存储等对比
    看到一篇文档,讲对象存储,好奇,搜索文章,摘抄,学习记录!背景:传统存储在面对海量非结构化数据时,在存储、分享与容灾上面临很大的挑战,主要表现在以下几个方面:传统存储并非为非结 ... [详细]
author-avatar
下个路口见的
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有