如何在客户端程序中实现连接远程服务器?
小弟目前正在学习制作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




