使用Remoting实现数据库访问 (remoting 访问数据库)

在分布式系统中,远程对象通信技术实现了不同计算机上的应用程序进行通信和交互。Remoting就是一种远程对象通信技术。在开发这样的分布式系统时,我们经常需要访问数据库里面的数据并进行操作,那么如何呢?本文将详细介绍如何使用Remoting技术实现数据库访问。

一、什么是Remoting技术?

Remoting技术是一种基于.NET的远程对象通信技术,可以让一个对象在一个应用程序域中向另一个应用程序域中的对象发送消息。这种技术需要至少两个应用程序域之间的通信。

Remoting使用两个对象,一个是客户端对象,一个是服务器端对象,客户端对象根据需要创建服务器端对象并向其发送消息,服务器端对象接收消息并响应。这种技术可以在两个应用程序域之间直接传送对象和数据。

二、如何使用Remoting技术访问数据库?

1. 创建Remoting服务

首先需要创建Remoting服务。创建一个Remoting服务的过程包括:

(1)创建远程接口

远程接口是客户端对象将要调用的远程方法的。客户端通过这些方法来访问远程对象。在这个例子中,我们需要一个接口来定义访问数据库的远程方法。

(2)创建远程对象

远程对象是实现远程接口的类的实例。远程对象包含在服务器端应用程序中,它是由客户端对象创建的,然后通过远程接口来访问。

2.使用Remoting访问数据库

接下来,我们需要在服务器端应用程序中使用Remoting来访问数据库。主要包括:

(1)创建数据库连接

在服务器端应用程序中,我们需要使用ADO.NET来创建一个数据库连接。

(2)创建命令对象和处理数据

通过ADO.NET,我们可以使用SqlCommand和SqlDataAdapter类来创建命令对象和处理数据。使用SqlCommand类可以执行SQL语句,并将结果放入DataSet对象中。

(3)返回数据结果

服务器端对象负责执行SQL语句,并将数据结果返回给客户端对象。客户端对象可以使用返回的数据填充数据表格或数据集。

3.在客户端访问Remoting服务

当我们完成上述步骤后,我们可以大致确定如何在服务器端中使用Remoting来访问数据库。接下来需要在客户端中使用Remoting来调用远程方法并获取数据。主要包括以下步骤:

(1)创建一个客户端应用程序

客户端应用程序负责创建远程对象,然后调用远程方法。

(2)创建远程代理对象

创建远程代理对象,然后使用它来调用远程方法。可以使用.Net的Activator来创建远程代理对象。

(3)通过远程对象获取数据

客户端通过远程对象调用远程方法来获取服务器端的数据。

三、

在本文中,我们介绍了的步骤。首先创建一个Remoting服务,包括创建远程接口和远程对象。接下来在服务器端应用程序中使用Remoting访问数据库,并将结果返回给客户端对象。客户端对象可以通过远程代理对象调用远程方法获取服务器端的数据。这样我们就可以使用Remoting技术来实现数据库访问。

相关问题拓展阅读:

要通过webserver访问远程数据库的内容返回数据集,并存到本地数据库。要怎么做呀。

我不知道你的webserver是个什么东西,我暂时把他当做remoting或者webservice吧,在客户端调用webserver,webserver查询数据库,查询结果转换成XML,传回客户端,客户单端处理一下插入数据库就可以了吧,希望我说的对你有帮助

.net Remoting编程-客户端订阅服务端事件

之一步:创建共享库

依次点击“文件”->“新创建”->“工程”,选慎正择创建一个c# library,并将其命名为resumeserverlibrary,然后点击ok按钮。这将创建一个我们的.net remote客户端和服务器端用来通讯的“共享命令集”。

正面是完整的代码,如果要跳过数据库访问部分,可以使用下面的代码替换春孝陵resumeloader对象:

public class resumeloader : system.marshalbyrefobject

{

 public resumeloader()

 {

  system.console.writeline(“new referance added!”);

}

public resume getresumebyuserid(decimal userid)

 {

  return new resume(1);

 }

}

名字空间是对象所需要的。请记住,如果得到system.runtime.remoting.channels.tcp名字空间不存在的信息,请检查是否象上面的代码那样添加了对system.runtime.remoting.dll的引用。

using system;

  using system.runtime;

  using system.data.sqlclient;

我们为对象使用的名字空间是dotnetremotetest,下面的对象是marshalbyrefobject,在其中我们创建了一个引用和包括服务器端数据库操作全部完成所需要的扒戚所有工作。

namespace dotnetremotetest

  {

  public class resumeloader : system.marshalbyrefobject

  {

  private sqlconnection dbconnection;

public resumeloader()

  {

  this.dbconnection = new system.data.sqlclient.sqlconnection();

  this.dbconnection.connectionstring =

  ”data source=grimsaado2k;initial catalog=underground;integrated security=sspi;pers” +

  ”ist security info=true;workstation id=grimsaado2k;packet size=4096″;

  /*具体的连接字符串会有所不同,这超出了本篇文章的范围。如果不清楚如何创建一个数据库连接,请使用这一对象的另一个版本。*/

  system.console.writeline(“new referance added!”);

  }

public resume getresumebyuserid(decimal userid)

  {

  resume resume = new resume();

  try

  {

  dbconnection.open();

  sqlcommand cmd = new sqlcommand(

  ”select resumeid, userid, title, body from resume as theresume where theresume.userid=”+ userid +””

  , dbconnection

  );

  sqldatareader areader = cmd.executereader();

  if(areader.read())

  {

  resume.resumeid=areader.getdecimal(0);

  resume.userid=areader.getdecimal(1);

  resume.title=areader.getstring(2);

  resume.body=areader.getstring(3);

  }

  areader.close();

  dbconnection.close();

  }

  catch(exception x) { resume.title=”error:”+x; }

  return resume;

  }

  }

resume需要能够被串行化,以便能作为被远程调用的.net remote对象的返回类型,原因是该对象将被转换为通过网络传输的原始数据,然后在网络的另一端再被装配成一个对象。

该对象非常简单,为了使本篇文章看起来更简单,其中的构造器甚至使用缺省的内容初始化其中的一些域。

  public class resume

  {

  private decimal resumeid, userid;

  private string body, title;

  public resume(decimal resumeid)

  {

  this.resumeid=resumeid;

  this.userid=1;

  this.body=”this is the default body of the resume”;

  this.title=”this is the default title”;

  }

public decimal resumeid

  {

  get { return resumeid; }

  set { this.resumeid=value; }

  }

public decimal userid

  {

  get { return userid; }

  set { this.userid=value; }

  }

public string body

  {

  get { return body; }

  set { this.body=value;}

  }

public string title

  {

  get { return title; }

  set { this.title=value; }

  }

  }//resume对象结束

  }//dotnetremotetest名字空间结束

编译创建的工程,就会得到一个dll文件,并可以在其他的工程中使用它。

第二步:创建server对象

有几种方法可以创建server对象,最直观的方法是下面的方法:在visual studio.net中,依次点击“文件”->“新创建”->“工程”,选择创建一个“command line application”(命令行应用程序),并将它命名为resumesuperserver。

最最重要的是,我们需要添加对刚才在之一步中所创建的dll文件的应用,该应用程序才能正确地运行。依次点击“工程”->“添加引用”,然后通过点击“浏览”按钮添加一个对在之一步中所创建的dll文件的引用。

为了使用.net remote功能,必须通过选择“工程”->“添加引用”,添加对dll文件的引用。在.net标签中选择system.runtime.remoting.dll,然后点击“ok”按钮。然后,需要象我们在之一步中那样添加对system.runtime.remoting.dll的引用。

下面的对象相当的简单和直观,我将就真正与.net remoting相关的3行代码中的每一行进行解释。

tcpserverchannel是.net remoting支持的二种信道类型中的一种,它将设置我们希望我们的对象对来自哪一个端口的请求进行回应,channelservices.registerchannel将把该端口号与操作系统中的tcp/ip栈绑定。

tcpserverchannel channel = new tcpserverchannel(9932);

  channelservices.registerchannel(channel);

另一种可以设置的信道类型是http,只要简单地使用system.runtime.remoting.channels.http名字空间中的httpserverchannel对象即可搞定。使用http和tcp信道之间的区别可以简单的归结为:如果应用程序是在局域网上运行,则更好使用tcp信道,因为它的性能要好于http信道;如果应用程序是在互联网上运行,则有时候根据防火墙的配置,http是唯一的选择。需要记住的是,如果使用了防火墙软件,则防火墙应该配置成允许tcp数据流量通过你为对象选择的端口。

remotingconfiguration.registerwellknownservicetype(typeof(resumeloader),

  ”resumeloader”, wellknownobjectmode.singlecall);

这行代码设置了服务中的一些参数和把欲使用的对象名字与远程对象进行绑定,之一个参数是绑定的对象,第二个参数是tcp或http信道中远程对象名字的字符串,第三个参数让容器知道,当有对对象的请求传来时,应该如何处理对象。尽管wellknownobjectmode.single对所有的调用者使用一个对象的实例,但它为每个客户生成这个对象的一个实例。

完整的对象代码如下所示:

using system;

  using system.runtime;

  using system.runtime.remoting;

  using system.runtime.remoting.channels;

  using system.runtime.remoting.channels.tcp;

  using system.data.sqlclient;

  using dotnetremotetest;

  namespace resumeserverserver

  {

  public class resumesuperserver

  {

  public static void main(string args)

  {

  tcpserverchannel channel = new tcpserverchannel(9932);

  channelservices.registerchannel(channel);

  remotingconfiguration.registerwellknownservicetype(typeof(resumeloader),

  ”resumeloader”, wellknownobjectmode.singlecall);

  system.console.writeline(“press any key”);

  system.console.readline();

  }

  }

  }

编译这一程序并注意生成的.exe文件的位置。

第三步:创建remote客户端程序

resumeclinet是我们为对在上面创建的resumesuperserver远和对象进行测试而创建的。要创建这一工程,可以依次点击“文件”->“创建”->“工程”,然后选择创建一个console application类型、名字为resumeclient的工程名。象在第二步中那样,我们需要添加对在之一步中创建的dll文件和system.runtime.remoting dll的引用。

下面的代码中有二行对于.net remoting而言是特别重要的。之一行创建了一个tcp客户端信道,该信道并不是绑定在一个端口上的;第二行获取了一个对远程的resumeloader对象的引用。activator.getobject方法返回一个对象类型的值,我们随后会将它返回的值赋予resumeloader。我们传给它的参数与在服务器工程中传递给remotingconfiguration的参数非常地相似,之一个参数是对象类型的,第二个参数是远程对象的uri。

channelservices.registerchannel(new tcpclientchannel());

  resumeloader loader = (resumeloader)activator.getobject(

  typeof(resumeloader), ”

resumeclient的全部代码如下所示:

  using system;

  using system.runtime.remoting;

  using system.runtime.remoting.channels;

  using system.runtime.remoting.channels.tcp;

  using dotnetremotetest;

namespace resumeclient

  {

public class resumeclient

  {

public static void main(string args)

  {

  channelservices.registerchannel(new tcpclientchannel());

  resumeloader loader = (resumeloader)activator.getobject(

  typeof(resumeserver), ”

if(rs==null)

  { console.writeline(“unable to get remote referance”); }

  else

  {

  resume resume = loader.getresumebyuserid(1);

  console.writeline(“resumeid:”+ resume.resumeid);

  console.writeline(“userid:”+ resume.userid);

  console.writeline(“title:”+ resume.title);

  console.writeline(“body:”+ resume.body);

  }

  console.readline();//在能够看到结果前不让窗口关闭

  }//end of main method

  }//end of resumeclient object

  }//end of resumeclientnamespace

测试

在数据库中创建一个具有如下结构的表:

table name-resume

  resumeid, numeric (autonumber)

  userid, numeric

  title, char(30)

  body, text

双击我们在第二步中创建的server.exe,然后双击在第三步中创建的client可执行文件。如果一切正常的话,我们应该能够看到数据库中resumeid的值为1的记录行。

关于remoting 访问数据库的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。


数据运维技术 » 使用Remoting实现数据库访问 (remoting 访问数据库)