CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
不看会后悔的Windows XP之经验谈 简单快捷DIY实用家庭影院
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  Delphi >  数据库相关

如何在客户端程序中实现连接远程服务器?

楼主ronk(ARCHER)2005-05-02 01:50:36 在 Delphi / 数据库相关 提问

小弟目前正在学习制作C/S结构的数据库应用程序(毕业设计~~马上就要交了,急死人了),  
   
  现在的情况是:  
  1、程序界面已经完成;  
  2、在应用程序中设置有DATA   MODULE(放置有一ADOCONNECTION组件和若干ADOTABLE,ADOQUERY,DATASOURSE组件);  
  3、ADOCONNECTION组件连接的是本机存放的MS   SQL   数据库;  
  4、程序中所有的查询,浏览,修改业务均通过调用数据模块中的ADO数据集组件完成;  
   
  遇到的问题:  
  1、应如何在程序中设置连接远程MS   SQL   服务器?  
  2、应在程序中加入什么元素或代码,使得用户可以选择和设置程序所要连接的远程数据库服务器?  
  3、具体应如何实现?  
   
  遇到的疑问:  
  小生最近在网上找到一做三层分布式数据库系统的例子和源代码(请原谅我不劳而获),发现该系统有一方便的设计。就是可以单独运行一程序,在选择“重新连接”按钮后程序弹出一界面,其界面和我们在设计中设置ADOCONNECTION组件的CONNECTIONSTRING属性时出现的界面一模一样。这样便可以很方便地选择所要连接的远程服务器及数据库。  
  小生本想照着这方法来设计自己的程序,可是,问题也就来了:  
  该程序在设计时,直接在程序中添加和设置了ADOCONNECTION组件;而小生则是希望此界面能通过调用本已设计好的数据模块中的ADOCONNECTION组件。在这里请问各位高手、各位老师,我应如何解决这个问题?  
   
  写得很长,不知道描述得清楚了没有?还请大家多多指教,多多帮忙。先谢谢大家了~~  
   
  问题点数:0、回复次数:12Top

1 楼ronk(ARCHER)回复于 2005-05-02 02:24:58 得分 0

我所找到的程序的代码(只是其中一部分但却是我最想在自己程序中添加的部分):  
   
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   Buttons,   DB,   ADODB,IniFiles,   Menus,   jpeg,   ExtCtrls,adoconed;  
   
  type  
      TForm1   =   class(TForm)  
          ADOConnection1:   TADOConnection;  
          BitBtn1:   TBitBtn;  
          MainMenu1:   TMainMenu;  
          Image1:   TImage;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   BitBtn1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
      MyIniFile:TIniFile;  
   
  implementation  
   
  {$R   *.dfm}  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
        filename:string;  
  begin  
        filename:=ExtractFilePath(paramstr(0))+'dbconf.ini';  
        myinifile:=Tinifile.Create(filename);  
        adoconnection1.ConnectionString:=myinifile.ReadString('dbconf','connectstring','');  
        try  
            adoconnection1.Connected:=true;  
        except   //当没有sql联接时使用access联接  
            adoconnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data   Source='+ExtractFilePath(Application.Exename)  
            +'back\图书馆管理系统.mdb;Persist   Security   Info=False';  
            adoconnection1.Connected:=true;  
        end;  
        if   adoconnection1.Connected=false   then  
        showmessage('数据库存连接错误');  
  end;  
   
  procedure   TForm1.BitBtn1Click(Sender:   TObject);  
  var  
      filename:string;  
  begin  
      filename:=ExtractFilePath(paramstr(0))+'dbconf.ini';  
      myinifile:=Tinifile.Create(filename);  
      ADOConnection1.Close;  
      EditConnectionString(ADOConnection1);  
      myinifile.WriteString('dbconf','connectstring',adoconnection1.ConnectionString);  
      myinifile.Free;  
  end;  
  end.  
   
  可是,当我把原来的ADOCONNECTION1删除,新建一数据模块并引用时,编译通过,运行起来却出现错误:“Access   violation   at   address   004A7408   in   module   'Project1.ext'   .Read   of   address   00000058.”     点确定便可以进入界面,然后就可以设置连接远程服务器和数据库了。但问题是:弹出这么个出错的提示到底是因为什么地方搞错了呢??求解~~~  
  下面是我改了后的代码:  
  unit   Unit1;  
   
  interface  
   
  uses  
      Windows,   Messages,   SysUtils,   Variants,   Classes,   Graphics,   Controls,   Forms,  
      Dialogs,   StdCtrls,   Buttons,   DB,   ADODB,IniFiles,   Menus,   jpeg,   ExtCtrls,adoconed;  
   
  type  
      TForm1   =   class(TForm)  
          BitBtn1:   TBitBtn;  
          MainMenu1:   TMainMenu;  
          Image1:   TImage;  
          procedure   FormCreate(Sender:   TObject);  
          procedure   BitBtn1Click(Sender:   TObject);  
      private  
          {   Private   declarations   }  
      public  
          {   Public   declarations   }  
      end;  
   
  var  
      Form1:   TForm1;  
      MyIniFile:TIniFile;  
   
  implementation  
   
  uses   Unit2;  
   
  {$R   *.dfm}  
   
  procedure   TForm1.FormCreate(Sender:   TObject);  
  var  
        filename:string;  
  begin  
        filename:=ExtractFilePath(paramstr(0))+'dbconf.ini';  
        myinifile:=Tinifile.Create(filename);  
        DM.ADOConnection1.ConnectionString:=myinifile.ReadString('dbconf','connectstring','');  
   
        dm.ADOConnection1.Connected:=TRUE;  
   
        {try  
            adoconnection1.Connected:=true;  
        except   //当没有sql联接时使用access联接  
            adoconnection1.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Data   Source='+ExtractFilePath(Application.Exename)  
            +'back\图书馆管理系统.mdb;Persist   Security   Info=False';  
            adoconnection1.Connected:=true;  
        end;   }  
   
        if   dm.adoconnection1.Connected=false   then  
        showmessage('数据库存连接错误');  
  end;  
   
  procedure   TForm1.BitBtn1Click(Sender:   TObject);  
  var  
      filename:string;  
  begin  
      filename:=ExtractFilePath(paramstr(0))+'dbconf.ini';  
      myinifile:=Tinifile.Create(filename);  
      DM.ADOConnection1.Close;  
      EditConnectionString(DM.ADOConnection1);  
      myinifile.WriteString('dbconf','connectstring',DM.ADOConnection1.ConnectionString);  
      myinifile.Free;  
  end;  
  end.Top

2 楼ronk(ARCHER)回复于 2005-05-02 03:30:05 得分 0

上面这个问题,我暂时的解决办法是在  
    myinifile.WriteString('dbconf','connectstring',DM.ADOConnection1.ConnectionString);  
    myinifile.Free;  
  的后面加上几句,通过传输连接字符串来解决了:  
  DM.ADOConnection1.ConnectionString:=ADOConnection1.ConnectionString;  
  DM.ADOConnection1.Connected:=True;  
   
  但如果是这样,新的问题又来了~~  
  1、每次启动客户端程序时,我都必须进行连接,不然所有的数据信息浏览查询什么的都用不了。好麻烦啊~~~  
  2、因为Connection   String   是写进ini文件的,我每次点连接,在弹出的连接框的"use   connection   string"中,所有的连接选项都一览无遗,包括老婆都不能告诉的PASSWORD!这样的话,后台数据库的安全性可真是要低得可怜了啊……  
   
  本人刚刚接触C/S结构数据库程序设计,问的问题有的很白痴,描述起来更加白痴。看着自己的帖子没人回应心里真是比冰块都凉——毕竟过几天就要上交毕业设计了,55555  
  在这里多说一两句,希望大家看了就当个小猪在跳舞,娱乐的同时,也请您多施援手,帮帮我~~~谢谢Top

3 楼78hgdong(赤脚)回复于 2005-05-02 07:58:50 得分 0

:“Access   violation   at   address   004A7408   in   module   'Project1.ext'   .Read   of   address   00000058.”     这可能是读取了无效的内存地址值,PASSWORD不是存在数据库吗?难道你把子PASSWORD写在INI文件?   这样不好吧!Top

4 楼ronk(ARCHER)回复于 2005-05-03 22:47:53 得分 0

现在我也是为了这个问题而苦恼,但是又想不到办法做连接。不知道那CONNECTION   STRING   怎么写~~不知道能否给个例子?Top

5 楼ronk(ARCHER)回复于 2005-05-03 22:49:37 得分 0

现在我能做的就是把数据模块中的数据集组件全都连到那个登陆FORM上。就要到交毕业设计的时间了,也只能这么解决了。但还是很想知道对于这个问题应该如何解决?Top

6 楼aloelan(阿岚)回复于 2005-05-04 11:57:09 得分 0

procedure   TDM.DataModuleCreate(Sender:   TObject);  
  var  
      Host:   string;           //服务器地址  
      DbName:   string;       //   数据库名称  
      DbUser:   string;       //  
      UserPwd:   string;     //  
      ConnStr:   string;     //连接字符串  
      Reg:   TRegistry;  
  begin  
      Reg:=TRegistry.Create;  
      with   Reg   do  
                begin  
                    try  
                        RootKey   :=   HKEY_CURRENT_USER;  
                        OpenKey('\SoftWare\HongRi',True);  
                        Host   :=   ReadString('Host');  
                        DbName   :=   ReadString('DbName');  
                        DbUser   :=   ReadString('DbUser');  
                        UserPwd   :=   ReadString('UserPwd');  
                        if   UserPwd   =   ''   then  
                              ConnStr:='Provider=SQLOLEDB.1;Persist   Security   Info=False;'   +  
                                  'User   ID='   +   DbUser   +   ';Initial   Catalog='+DbName+  
                                  ';Data   Source='   +   Host  
                        else  
                              ConnStr   :='Provider=SQLOLEDB.1;Password='   +   UserPwd   +  
                                  ';Persist   Security   Info=True;'   +   'User   ID='   +   DbUser   +  
                                  ';Initial   Catalog='+DbName+';Data   Source='   +   Host;  
                        AdoCnn.ConnectionString:=ConnStr;  
                        AdoCnn.Connected:=True;  
                    finally  
                        CloseKey;  
                        Free;  
                    end;  
                end;  
  end;  
   
  如上:我一般写再注册表里!觉得密码不安全的话,可以用算法加密一下!Top

7 楼ting8325()回复于 2005-05-04 18:34:10 得分 0

问几个很蠢的问题,什么样才算是C/S结构?  
   
  是不是应用程序服务器+客户端?  
   
  仅有一个访问本机上数据库的应用程序算不算C/S结构?  
   
  按楼主的描述更改后的还是C/S结构吗?  
  Top

8 楼mingyuexin56()回复于 2005-05-05 18:06:30 得分 0

我做的毕业设计和你的一样哦,可是看了你的我觉得我的做得好垃圾哦,惭愧啊Top

9 楼forceboy(蛮子)回复于 2005-05-05 22:57:25 得分 0

你把它做成三层的不就得了!比如说用SOCKET,在用户登录时将用户名和密码发到服务端,再由服务端在数据库中验证,至于对数据库的操作也是一样的将其封装成一个包发给服务端来处理,再将结果发回给你的客户端.Top

10 楼5043682(投身于..??)回复于 2005-05-06 00:20:29 得分 0

如果用DELPHI里的bde,必须要使用数据源建数据库别名吗?Top

11 楼ronk(ARCHER)回复于 2005-05-13 19:44:45 得分 0

如果用BDE,就得在BDE   ADMINISTRATOR里做设置,比较麻烦。还是用ADO好。Top

12 楼ting8325()回复于 2005-05-17 18:00:50 得分 0

我也觉得用ADO比较方便,使用的人比较多Top

相关问题

  • 请问怎样用pb实现客户端远程调用服务器程序?
  • vb客户端程序通过拨号,连远程数据库服务器,如何将本地数据库数据上传到服务器数据库中。
  • 服务器-客户端程序.
  • 如何实现远程更新服务器端程序?
  • 服务器远程控制客户机,该怎么办?
  • 远程客户端如何连接Domino 服务器?
  • 一台客户端如何连接上远程的服务器????
  • 服务器端和客户端的远程连接?
  • 如何配置服务器支持客户端远程登录?
  • VB客户端如何连接远程服务器?

关键词

  • 数据库
  • 组件
  • 连接
  • 服务器
  • 远程
  • 界面
  • 联接
  • 数据
  • 客户
  • 模块

得分解答快速导航

  • 帖主:ronk

相关链接

  • Delphi类图书
  • Delphi类源码下载
  • Delphi控件下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo