利用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下调试运行通过。

时间: 2024-11-18 00:30:59

利用C#远程存取Access数据库的相关文章

mfc利用ado链接access数据库

问题描述 mfc利用ado链接access数据库 1C 连接之后并没有自动生成一些和ado相关的类,是正常的么... 解决方案 MFC利用ADO操作Access数据库VC ADO链接ACCESS数据库C#链接ACCESS数据库 解决方案二: [http://blog.sina.com.cn/s/blog_610c1cad0100yhrr.html] 解决方案三: // UserData.cpp : implementation file//#include ""stdafx.h&quo

利用ASP和Access数据库制作局域网网上答题系统

 信息社会对人的学历.素质要求越来越高,人们为了找到前途更好.收入更加诱人的工作岗位,必须通过各种各样的考试如注册会计师资格考试.司法资格考试等等,而各种各样的试题资料也应运而生,但所有的资料所共有的一个缺点就是使用上的不方便.不灵活.及效率不高,本网上答题系统正是为了弥补这些诸多不便而编制的.适合于局域网并能在单机上运行的系统,下面就详细介绍本系统的编制及使用方法. 一.界面  如图所示:  二.程序组成 本系统由Index. asp.Lkzk.asp.Save.asp.Db0.fun 四个小

IIS中利用重定向URL来防止Access数据库被下载的方法

对于ASP+Access开发的网站,安全性最最让人担忧的就是Access数据库可以随意下载,当然我们可以通过一些修改数据库名称的手段进行尽量的防护,但归根结底是不彻底的.所以今天就来谈谈在IIS中利用重定向URL来防止Access数据库被下载的方法. 此方法需要你有IIS的管理权限,如果你使用的是虚拟主机,那估计没有办法了,呵呵.这里假设你有IIS的管理权限. 1.首先打开Internet 信息服务(IIS)管理器,在Internet 信息服务(IIS)管理器左边窗口中找到你数据库所在的文件夹,

利用jdbc连接db2数据库

问题描述 利用jdbc连接db2数据库 数据库连接配置如下: jdbc.driver=com.ibm.db2.jcc.DB2Driver jdbc.url=jdbc:db2://localhost:50000/finical jdbc.username=db2admin jdbc.password=325314 报错如下: com.ibm.db2.jcc.b.DisconnectException: The application server rejected establishment of

直接通过ADO操作Access数据库

我在"直接通过ODBC读.写Excel表格文件"和"直接通过DAO读.写Access文件",先后给大家介绍了ODBC和DAO两种数据库访问技术的基本使用方法,这次要给大家介绍的是ADO数据库访问技术的使用方法.ADO(Active Data Object,活动数据对象)实际上是一种基于COM(组件对象模型)的自动化接口(IDispatch)技术,并以OLE DB(对象连接和镶入的数据库)为基础,经过OLE DB精心包装后的数据库访问技术,利用它可以快速的创建数据库应

如何通过ASP在ACCESS数据库新建表(自动编号ID)

access|数据库 下面代码是一个最简单的利用ASP创建ACCESS表的示例代码,创建的ID编号为自动编号.   <%dim conn dim dbpath set conn=server.createobject("adodb.connection") dbpath=Server.mappath("data/data.mdb") conn.Open "driver={Microsoft Access Driver (*.mdb)};dbq=&qu

Access数据库被损坏的修复方法

Access数据库被损坏主要分为以下几种情况:1.严重损坏:2.轻度损坏:3.有些表被损坏或有些表的部分记录被损坏.下面就分情况介绍解决办法. Access数据库被损坏主要分为以下几种情况:1.严重损坏:2.轻度损坏:3.有些表被损坏或有些表的部分记录被损坏.下面就分情况介绍解决办法. 1.使用Access97打不开数据库.系统提示"不可识别的数据库格式"或"不是该表的索引"等信息,这样的数据库都是损坏比较严重的.损害严重的数据库一般来说都是无法修复的,只有恢复备份

逐步讲解向Access数据库上传且显示图片

本文从多个角度来讲解如何在Access数据库上如何上传并且显示上所上传图片. 在动态网站制做过程中,需要上传图片.显示图片,上传的图片要能够保存在数据库中,一般小型网站只支持Access数据库,如何上传图片,将其保存在数据库中并将其显示出来,是数据库+ASP应用技术之一.许多书籍只介绍了SQL数据库的方法,而对Access却很少提及.网上有不少关于Access数据库上传图片.显示图片的文章,多数文章介绍的不够全面,有些程序根本就不能开通,对于初学者来说很难把握,我通过参考一些文章,向初学者提供一

SQL链接服务器访问远程Access数据库

由于Access数据库是一种文件型数据库,所以无法跨服务器进行访问.下面我们来介绍一下如何利用SQL Server 的链接服务器,把地理上分散的Access 数据库整合起来,使 Access 数据库具有跨越 Web 服务器群的能力.此方法还可以使 Access 数据库与SQL Server数据库,甚至 Oracle 等网络数据库连接起来,实现异构数据库的互连,最终执行分布式的查询.更新.命令和事务. 1.创建链接服务器,连接本地 Access 数据库 创建链接服务器可以用"企业管理器"