DELPHI盒子
!实时搜索: 盒子论坛 | 注册用户 | 修改信息 | 退出
检举帖 | 全文检索 | 关闭广告 | 捐赠
技术论坛
 用户名
 密  码
自动登陆(30天有效)
忘了密码
≡技术区≡
DELPHI技术
lazarus/fpc/Free Pascal
移动应用开发
Web应用开发
数据库专区
报表专区
网络通讯
开源项目
论坛精华贴
≡发布区≡
发布代码
发布控件
文档资料
经典工具
≡事务区≡
网站意见
盒子之家
招聘应聘
信息交换
论坛信息
最新加入: szliyu112358
今日帖子: 52
在线用户: 13
导航: 论坛 -> 数据库专区 斑竹:liumazi,waterstone  
作者:
男 boomyear (boomyearzkr) ★☆☆☆☆ -
普通会员
2015/5/27 11:13:10
标题:
delphi 如何用DLL模式开发数据库系统,exe+dll+datamoudl操作数据库? 浏览:1726
加入我的收藏
楼主:   Delphi传统模式开发模式修改程序时需要重新编译整个项目。用DLL模式只需要修改相关的DLL。网上的大部份都是传统模式开发的资料,好像很少DLL模式开发的参考资料。

用DLL模式按下列设计方案,做一个简单的显示数据库内容
1、Data Module放ADOConnection、ADOQuery
2、主窗体MainForm放DBGrid、DataSource显示数据
3、DLL中写个函数实现数据库连接以及获取数据。

要怎么实现呢?

另外,实际开发过程中,DLL开发模式是如何设计的呢?
----------------------------------------------
-
作者:
男 pengshaomin (我爱编程) ★☆☆☆☆ -
普通会员
2015/5/27 12:27:53
1楼: 了解下mybean开源项目
----------------------------------------------
-
作者:
男 boomyear (boomyearzkr) ★☆☆☆☆ -
普通会员
2015/5/27 12:39:41
2楼: 盒子果然不错,这么快就有答复,感谢!
除了mybean 好像还有用tangram框架的,不知道tangram怎么样?
----------------------------------------------
-
作者:
女 sunyesy (文儿) ★☆☆☆☆ -
盒子活跃会员
2015/5/27 13:09:56
3楼: http://bbs.2ccc.com/default.asp?roomid=&keyword=mybean&keyrange=1
----------------------------------------------
大象说他Delphi比我好,我想了三天没明白是怎么回事!按此在新窗口浏览图片
作者:
男 pengshaomin (我爱编程) ★☆☆☆☆ -
普通会员
2015/5/27 14:25:58
4楼: tangram 在用 .
mybean比较灵活
----------------------------------------------
-
作者:
男 grjs_2004 (grjsITname) ★☆☆☆☆ -
盒子活跃会员
2015/5/27 17:38:21
5楼: 这技术,古老的很!

建议使用三层模式,用数据链接池、线程池来处理数据交互,建立公用类提供客户端继承开发。你这样搞个Data Module放ADOConnection、ADOQuery,实在是孩童级玩具!
----------------------------------------------
Everyone will to do best!
作者:
男 boomyear (boomyearzkr) ★☆☆☆☆ -
普通会员
2015/5/27 19:06:50
6楼: [quote]这技术,古老的很!

建议使用三层模式,用数据链接池、线程池来处理数据交互,建立公用类提供客户端继承开发。你这样搞个Data Module放ADOConnection、ADOQuery,实在是孩童级玩具![quote]
----------
    我也就是初级水平的,三层、连接池...这些对我来说感觉还是比较深奥,看了tangram帮助文档,还是云里雾里的感觉,mybean就更不清楚了,好像资料都比较少,我还得多学习。

    就目前我的这个孩童级的DLL开发模式做了好几天我都做不出来,谁能指导一下,或者给个案例让我学学。这方面的开发资料好像真的很少。
----------------------------------------------
-
作者:
男 go_on (go_on) ★☆☆☆☆ -
盒子活跃会员
2015/5/27 21:44:30
7楼: 考虑一下插件也可以,可以不停的增加业务
----------------------------------------------
www.eudn.cn工程师联合开发网
作者:
女 google220 (google220) ★☆☆☆☆ -
普通会员
2015/5/28 17:51:53
8楼: 别犹豫就exe+Dll,这已经很强了。
----------------------------------------------
菩提本无树,明镜亦非台,本来无一物,何处惹尘埃
作者:
男 boomyear (boomyearzkr) ★☆☆☆☆ -
普通会员
2015/5/29 10:15:21
9楼: 我这水平太菜,参考了几天“全局变量共享“的办法也不来呢,能不能给个实例学学呀,我要写出来了就粘上来给初学者参考。
----------------------------------------------
-
作者:
男 sxqwhxq (步惊云) ★☆☆☆☆ -
普通会员
2015/5/29 17:19:16
10楼: 把接口放在dll中,是个好办法。
----------------------------------------------
-
作者:
男 boomyear (boomyearzkr) ★☆☆☆☆ -
普通会员
2015/5/29 20:52:27
11楼:     参考了网络上一个共享全局变量的例子,该例子能够实现EXE+DLL获取Datamodule中的adoconnection的连接字符串,该例子由DMDll.dll(datamodule)、CommonDll.dll(实现获取数据过程GetData()) 、主窗体Main构成,其中global.pas存放全局变量,供其它单元调用。
    该例在Delphi 7+win32位系统下可运行, 64位系统运行后主窗口不能显示。
  该例只是获取Datamodule中的adoconnection的连接字符串,我也尝试把GetData()改成由ADOQuery获取数据集,结果是编译不能通过。也不知道这个getdata()要怎么写才能把获取的数据集在Form1的DBGrid上显示出来。
  
  是不是因为没有创建内存映射的原因呢?

  以下是该例完整代码:

DMDll.dll

library DMDll;

{ Important note ......}

uses
  SysUtils,
  Classes,
  DM in 'DM.pas' {DataModule1: TDataModule},
  global in 'global.pas';

{$R *.res}

function GetGlobalData:PGlobalData;stdcall;
begin
  Result:=g_pGlobalData;
end;

exports
  GetGlobalData;

begin
  NEW(g_pGlobalData);
  g_pGlobalData^.ADOConn:=dm.DataModule1.ADOConn;
  g_pGlobalData^.Query1 :=dm.DataModule1.Query1;
  g_pGlobalData^.DS1:=dm.DataModule1.DS1;
end.

unit DM;

interface

uses
  SysUtils, Classes, DB, ADODB;

type
  TDataModule1 = class(TDataModule)
    ADOConn: TADOConnection;
    Query1: TADOQuery;
    DS1: TDataSource;
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  DataModule1: TDataModule1;

implementation

{$R *.dfm}

uses Activex;

initialization
  CoInitialize(nil);
  DataModule1:= TDataModule1.Create(nil);

finalization
  CoUninitialize;
end.

unit global;

interface

uses ADODB,DB;

type
  PGlobalData = ^TGlobalData;
  TGlobalData = record
    ADOConn:TAdoConnection;
    Query1:TADOQuery;
    DS1: TDataSource;
  end;

var
  g_pGlobalData:PGlobalData;      //全局变量[color=#FF0000][/color]implementation

end.
----------
CommonDll.dll

library CommonDll;

{ Important note ......}

uses
  SysUtils,
  Classes,
  global in 'global.pas',
  Dialogs;

{$R *.res}

procedure Init(P:Pointer);       //指针指向DMDll.dll的全局共享数据
begin
  g_pGlobalData:=P;
end;

procedure GetData();          //获取数据
begin
    if Assigned(g_pGlobalData) then
    ShowMessage(g_pGlobalData^.ADOConn.ConnectionString);
end;

exports
  Init,GetData;

begin
end.

----------
主窗体Form1

unit Main;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
    procedure FormCreate(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses global;
{$R *.dfm}

function GetGlobalData:PGlobalData;stdcall;external 'DMDll.dll';
procedure GetData;external 'CommonDll.dll';
procedure InitOtherDll1(P:Pointer);external 'CommonDll.dll' name 'Init';

procedure TForm1.Button1Click(Sender: TObject);
begin
  GetData;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  g_pGlobalData:=GetGlobalData;
  InitOtherDll1(g_pGlobalData);
end;

end.
----------------------------------------------
-
信息
登陆以后才能回复
Copyright © 2CCC.Com 盒子论坛 v3.0.1 版权所有 页面执行78.125毫秒 RSS