delphi_三层架构简单例子.
DelphiXE10跨平台三层数据库应用教程绑定

DelphiXE10跨平台三层数据库应用教程绑定Delphi XE 开始越来越庞大,比经典的Delphi7难用,但依然是目前所有跨平台开发工具中开发效率最高、最容易上手的,其快速设计RAD理念是无与伦比的符合人性(什么?是懒惰)。
目前网上XE10类似教程很少,而且学习途中遇到一些问题就难以继续了,经本菜鸟千辛万苦的求索,特推出Delphi XE 10系列教程。
三层数据库应用是目前最简单、方便、易扩展的架构,而跨平台应用又是所谓的“互联网+”最需要的,下面的教程分服务器端和客户端两大部分完成该设计。
一、Delphi XE10 datasnap服务器设计(1)生成DataSnap服务器的框架初学者都是呆子,还是用向导吧,主菜单“File”->“New”->“Other…”得到“New Items”向导对话框。
见图一。
图一、?向导一般选择有窗口的Forms程序,如果是正式场合,建议Service 程序。
见图二。
图二、选择应用类型如果服务器程序运行在Windows平台就选“VCLapplication”,如果要跨平台,还是选“FireMonkeyapplication”,但生成的文件要大一些。
见图三。
图三、选择应用基本库源默认TCP/IP为通讯协议,简单快速,菜鸟专用的Sample Methods用于测试,见图四。
图四、选择通讯等参数缺省211端口,别忘了“Test Port”一下更健康,见图五。
图五、测试端口不要使用默认的“TComponent”,而用TDSServerModule作为数据服务提供主体,非常方便以后变更为能挣钱的Service应用服务。
图六、选择服务模式Finish这个向导后,硬盘一阵轰鸣,自动生成了工程及其三个主文件,图七:ServerContainerUnit1.pas放的是网络服务相关控件,非高手莫入。
ServerMehtodsUnit1.pas就是我们第二步主要的活动场所。
三层架构及实例演示

三层架构及实例演示简述通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问(DAL)。
实例 登录界面这是一个经过改版的登录,视频里的用c#来实现的。
使用的工具:sql server 2010 、vs 2010建立数据库:Login 表:Scores、UsersScore表Users表LoginModel(实体层)创建实体层LoginModel,建立Userinfo类,存储从UI返回的数据。
这里我们称为业务实体层,因为他也是为业务逻辑服务的。
[vb] view plaincopyprint?Public Class UserInfoPrivate _ID As StringPrivate _Username As StringPrivate _Password As StringPrivate _Email As StringPublic Property ID As IntegerGetReturn _IDEnd GetSet(ByVal value As Integer)_ID = valueEnd SetEnd PropertyPublic Property Username As StringGetReturn _UsernameEnd GetSet(ByVal value As String)_Username = valueEnd SetEnd PropertyPublic Property Password As StringGetReturn _PasswordEnd GetSet(ByVal value As String)_Password = valueEnd SetEnd PropertyPublic Property Email As StringGetReturn _EmailEnd GetSet(ByVal value As String)_Email = valueEnd SetEnd PropertyEnd ClassLoginBLL(业务逻辑层)UI层调用业务逻辑层来执行登录的操作。
Delphi三层开发小技巧:TClientDataSet的Delta妙用

Delphi三层开发小技巧:TClientDataSet的Delta妙用Delphi三层开发小技巧:TClientDataSet的Delta妙用Delphi做三层开发时,很多人都会在客户端放一个TClientDataSet,中间层远程数据模块就对应放一个TDataSetProvider,然后再连起来.其实这种方法很烦琐,而且程序痈肿不甘,不好维护.我们都知道TClientDataSet的Delta属性记录了数据的所有修改,应用它我们就可以方便的实现一个单表更新的通用方法.首先,在中间层添加一个方法,就叫ApplyUpdates吧.方法定义如下: function ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;参数UpdateTable是指要更新的表名,Delta是指传过来的TClientDataSet的Delta属性,如果更新错误err返回错误的内容.下面实现这个方法,首先在DataModule上放一个Query,Query连上Connection,然后再放一个TDataSetProvider连Query.代码如下: function TRoDm.ApplyUpdates(const UpdateTable:String;Delta:Variant;out err:String):Boolean;const sql='select * from %s where 1<>1';var sqlstr:string;ErrCount:Integer;beginResult:=False;sqlstr:=Format(sql,[UpdateTable]);tryConn.BeginTrans;Query.Close;Query.sql.text:=sqlstr;Query.open;Provider.ApplyUpdates(Delta,-1,ErrCount);Result:=ErrCount=0;if Result thenmitTranselse Conn.RollbackTrans;excepton E:Exception dobeginConn.RollbackTrans;err:=E.Message;end;end;end;到此,通用的更新方法已经完成了.不过客户端的ClientDataSet还不能查询显示数据,因此,还要写一个查询方法:function QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;参数sqlstr就是要持行的查询语句,Data返回查询结果,错误时err 返回错误消息QuerySQL实现代码如下:function TRoDm.QuerySQL(const sqlstr:string;out Data:Variant;out err:String):Boolean;beginResult:=False;tryQuery.close;Query.sql.text:=sqlstr;Query.sql.Open;Data:=Provider.Data;Result:=True;Excepton E:Exception doerr:=E.Message;end;end;到这里,中间层的代码已经完了,客户端的调用就简单了.比如客户端有个数据模块DM,上面放一个DcomConnection或者SocketConnection,名叫Conn.例如,我们现在要做一个商品管理的功能,在窗体上放一个TClientDataSet叫Cds,放DataSource,DBGrid等,设置好相应的属性.然后在窗体创建(Create事件)时查询回所有数据,代码如下:const sql='select * from xxxx';var Data:Variant;err:String;beginif Dm.Conn.AppServer.QuerySQL(sql,Data,err) thenCds.Data:=Dataelse MessageBox(self.handle,pchar('查询数据出错:'+err),'错误',MB_OK+MB_ICONERROR);end;然后还有"添加","修改","删除"按扭,代码都和我们平时操作一样,比如"添加"按扭的代码:cds.append;cds.fieldbyname('xxx').asinteger:=xxx;//....cds.post;修改,删除也这样写.不过现在还有个小问题是,这个表的主键的生成问题,这里我们不能用自增主键,要自己自己生成主键,这样你还得在中间层写一个中间层生成主键的方法,在"增加"按扭时生调用生成主键,然后再上面的操作.这里不再多说.增删改完后,这时的数据还在客户端的内存里,想保存到远程的中间层服务器就要用到我们刚才的方法了,下面就是"保存"按扭下的代码:var err:string;beginif cds.ChangeCount=0 then exit;//数据没改变就不用提交了if Dm.Conn.AppServer.ApplyUpdates('xxx',cds.Delta,err) then//xxx就是表名了beginMessageBox(self.handle,'保存成功!','提示',MB_OK+MB_ICONINFORMATION);cds.MergeChangeLog;//合并所有改变的数据end else MessageBox(self.handle,pchar('保存出错:'+err),'错误',MB_OK+MB_ICONERROR);end;到此,这篇文章也讲完了.用这个方法,那些单表的基础数据更新还可以写成一个祖先类,只要加一个取得更新表名的虚方法,比如:function TableName:string;virtual;然后其后代只要override这个方法,返回各自的表名,其他的一句代码都不用写.分类: 三层。
三层架构简易实例详解

三层架构简易实例详解何为三层架构?通常意义上的三层架构就是将整个业务应用划分为:表现层(UI)、业务逻辑层(BLL)、数据访问层(DAL)。
区分层次的目的即为了“高内聚,低耦合”的思想。
1.表现层(UI):即展现给用户的界面;2.业务逻辑层(BLL):针对具体问题的操作,也可以说是对数据层的操作,对数据业务逻辑处理;3.数据访问层(DAL):该层所做事务直接操作数据库,针对数据的增添、删除、修改、查找等。
下面通过通过一个简单的例子来描述三层架构:需求1.实现一个客户信息管理界面(包括增加、修改、删除)操作;2.用户sql—server作为数据库以下是成型界面,至于UI设计是否合理,望各位大神拍砖UI层设计设计器代码:<Grid><DockPanel><ToolBar DockPanel.Dock="Top" Height="30"><Button Name="BtnAdd" Click="BtnAdd_Click" ToolTip="新增"><Image Source="Image\add.ico"></Image></Button><Button Name="BtnEdit" Click="BtnEdit_Click" ToolTip="编辑"><Image Source="Image\edit.ico"></Image></Button><Button Name="BtnDel" Click="BtnDel_Click" ToolTip="删除"><Image Source="Image\delete.ico"></Image></Button></ToolBar><DataGrid Name="DataGrid1" DockPanel.Dock="Top" IsReadOnly="True" AutoGenerateColumns="False"><DataGrid.Columns><DataGridTextColumn Header="姓名" Binding="{Binding Name}"></DataGridTextColumn><DataGridTextColumn Header="生日" Binding="{Binding BirthDay}"></DataGridTextColumn><DataGridTextColumn Header="电话" Binding="{Binding TelNum}"></DataGridTextColumn><DataGridTextColumn Header="地址" Binding="{Binding Address}"></DataGridTextColumn><DataGridTextColumn Header="等级" Binding="{BindingCustlevel}"></DataGridTextColumn></DataGrid.Columns></DataGrid></DockPanel></Grid>主要是通过设计器后台代码,DataGrid控件绑定数据,代码如下:/// <summary>/// 初始化加载数据/// </summary>private void LoadData(){DataGrid1.ItemsSource = CustomDAL.GetAll();}数据业务逻辑代码如下:/// <summary>/// 新增/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void BtnAdd_Click(object sender, RoutedEventArgs e){CustomEditUI editUI = new CustomEditUI();editUI.isInsert = true;if (editUI.ShowDialog() == true){LoadData();}}/// <summary>/// 编辑/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void BtnEdit_Click(object sender, RoutedEventArgs e){Custom customer = (Custom)DataGrid1.SelectedItem;if (customer == null){MessageBox.Show("请选择要编辑的行!");return;}CustomEditUI editUI = new CustomEditUI();//添加标识便于区分是编辑保存还是新增保存editUI.isInsert = false;editUI.editId = customer.Id;if (editUI.ShowDialog() == true){LoadData();}}/// <summary>/// 删除/// </summary>/// <param name="sender"></param>/// <param name="e"></param>private void BtnDel_Click(object sender, RoutedEventArgs e){if (MessageBox.Show("确认删除此条数据?", "提醒", MessageBoxButton.YesNo) == MessageBoxResult.Yes){Custom custom = DataGrid1.SelectedItem as Custom;if (custom != null){if ((MessageBox.Show("确认要删除此调数据", "提醒") == MessageBoxResult.OK)){CustomDAL.Delete(custom.Id);LoadData();}}else{MessageBox.Show("请选择要删除的数据", "提醒");return;}}}数据访问层(DAL),代码如下:public class CustomDAL{/// <summary>/// 查询数据总条数/// </summary>/// <returns></returns>public static int GetCount(){return (int)SqlHelper.ExecuteScalar("select * from T_Custom");}/// <summary>///根据ID查询数据/// </summary>/// <param name="id"></param>/// <returns></returns>public static Custom GetByid(long id){DataTable table = SqlHelper.ExecuteDataTable("select * from T_custom where id=@id", new SqlParameter("@id", id));return ToCustom(table.Rows[0]); ;}/// <summary>/// 根据id删除数据/// </summary>/// <param name="id"></param>public static void Delete(long id){SqlHelper.ExecuteNonQuery("delete from T_custom where id=@id", new SqlParameter("@id", id));}/// <summary>/// 插入空值处理/// </summary>/// <param name="value"></param>/// <returns></returns>public static object FromDBNull(object value){if (value == null){return DBNull.Value;}else{return value;}}/// <summary>/// 查询空值处理/// </summary>/// <param name="value"></param>/// <returns></returns>public static object ToDBNull(object value){if (DBNull.Value == null){return null;}else{return value;}}/// <summary>/// 新增数据/// </summary>/// <param name="custom"></param>public static void InSert(Custom custom){SqlHelper.ExecuteNonQuery(@"insert into T_Custom(Name,Birthday,Address,Telnum,Custlevel)values(@Name,@Birthday,@Address,@Teln um,@Custlevel)",new SqlParameter("@Name", ),new SqlParameter("@Birthday", FromDBNull(custom.BirthDay)),new SqlParameter("@Address", custom.Address),new SqlParameter("@Telnum", custom.TelNum),new SqlParameter("@Custlevel", custom.Custlevel));}/// <summary>/// 更新数据/// </summary>/// <param name="custom"></param>public static void UpDate(Custom custom){SqlHelper.ExecuteNonQuery(@"update T_Custom set Name=@Name,Birthday=@Birthday,Address=@Address,Telnum=@Telnum,Custlevel=@Custlevel where id=@id",new SqlParameter("@Name", ),new SqlParameter("@Birthday", FromDBNull(custom.BirthDay)),new SqlParameter("@Address", custom.Address),new SqlParameter("@TelNum", custom.TelNum),new SqlParameter("@Custlevel", custom.Custlevel),new SqlParameter("@Id", custom.Id));}/// <summary>/// 查询所有数据/// </summary>/// <returns></returns>public static List<Custom> GetAll(){DataTable table = SqlHelper.ExecuteDataTable("select * from T_custom");List<Custom> lst = new List<Custom>();for (int i = 0; i < table.Rows.Count; i++){lst.Add(ToCustom(table.Rows[i]));}return lst;}/// <summary>/// 影射关系赋值/// </summary>/// <param name="row"></param>/// <returns></returns>public static Custom ToCustom(DataRow row){Custom custom = new Custom(); = row["Name"].ToString();custom.Address = row["Address"].ToString();custom.BirthDay = (DateTime?)ToDBNull(row["BirthDay"]);custom.TelNum = row["TelNum"].ToString();custom.Custlevel = (int)row["CUstlevel"];custom.Id = (long)row["id"];return custom;}}public class SqlHelper{private static string connstr = ConfigurationManager.ConnectionStrings["conn"].ConnectionString;/// <summary>/// 查询数据/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public static Object ExecuteScalar(string sql, params SqlParameter[] parameters){using (SqlConnection cnn = new SqlConnection(connstr)){cnn.Open();using (SqlCommand cmd = cnn.CreateCommand()){mandText = sql;cmd.Parameters.AddRange(parameters);return cmd.ExecuteScalar();}}}/// <summary>/// 增、删、改操作/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>public static void ExecuteNonQuery(string sql, params SqlParameter[] parameters){using (SqlConnection cnn = new SqlConnection(connstr)){cnn.Open();using (SqlCommand cmd = cnn.CreateCommand()){mandText = sql;cmd.Parameters.AddRange(parameters);cmd.ExecuteNonQuery();}}}/// <summary>/// 单个查询结果返回/// </summary>/// <param name="sql"></param>/// <param name="parameters"></param>/// <returns></returns>public static DataTable ExecuteDataTable(string sql, params SqlParameter[] parameters){using (SqlConnection cnn = new SqlConnection(connstr)){cnn.Open();using (SqlCommand cmd = cnn.CreateCommand()){mandText = sql;cmd.Parameters.AddRange(parameters);SqlDataAdapter apter = new SqlDataAdapter(cmd);DataSet dataset = new DataSet();apter.Fill(dataset);return dataset.Tables[0];}}}}业务模型层public class Custom{public long Id { set; get; }public string Name { set; get; }public DateTime? BirthDay { set; get; }public string Address { set; get; }public string TelNum { set; get; }public int Custlevel { set; get; }}业务模型层public class Custom{public long Id { set; get; }public string Name { set; get; }public DateTime? BirthDay { set; get; }public string Address { set; get; }public string TelNum { set; get; }public int Custlevel { set; get; } }上述用思想,图形表示如下:。
三层架构简易实例详解

三层架构简易实例详解三层架构是一种软件设计模式,它将软件系统分为三个层次:表现层、业务逻辑层和数据访问层。
每个层次都有特定的职责,通过分层的方式提高了系统的可维护性、可扩展性和可复用性。
以下是一个简单的示例来解释三层架构的概念:1. 表现层(Presentation Layer):这是用户与系统交互的界面。
它负责接收用户的输入、展示数据和呈现界面效果。
可以使用 Web 页面、桌面应用程序或移动应用程序等来实现。
2. 业务逻辑层(Business Logic Layer):该层处理系统的核心业务逻辑。
它接收来自表现层的请求,执行相应的业务规则和计算,并与数据访问层进行交互以获取和保存数据。
3. 数据访问层(Data Access Layer):这一层负责与数据库或其他数据源进行交互。
它封装了数据的读取、写入、修改和查询操作,提供了一个统一的数据访问接口。
以下是一个简单的示例,以在线书店为例:1. 表现层:用户通过网站或移动应用程序浏览图书列表、查看图书详细信息、添加到购物车和进行结算。
2. 业务逻辑层:处理用户的请求,例如检查购物车中的图书数量、计算价格、应用折扣等。
它还负责与数据访问层交互以获取图书信息和保存用户的订单。
3. 数据访问层:与数据库进行交互,执行图书的查询、插入、更新和删除操作。
通过将系统划分为三层,每层专注于特定的职责,可以提高代码的可维护性和可复用性。
当需求发生变化或需要进行系统扩展时,只需修改相应层次的代码,而不会影响其他层次。
这种分层的架构也有助于团队协作和开发效率。
请注意,这只是一个简单的示例,实际的三层架构应用可能会更加复杂,并涉及更多的模块和技术。
具体的实现方式会根据项目的需求和规模而有所不同。
三层架构实例

三层架构实例4、三层架构下的包图:注:Entity中放的都是实体类,即由数据库中的表抽象出来的类。
实体类主要作为数据的载体,在各个层之间被传递。
我们现在要做的就是对⽤例图中所⽰的这个功能进⾏抽象,即分别在UI,BLL,DAL三层抽象类。
数据访问层DAL:数据库中的⼀张表对应DAL层的⼀个类,所以这⾥要有⼀个dal_DealStudentInfo类,它必然有⼀个⽅法AddRecord,⽤于向数据库中添加数据。
这个⽅法的参数便是studentInfo这张表映射出的⼀个实体类的⼀个实例,⽅法中包含了⼀些SQL语句。
IsExist是验证数据有效性,这⾥主要是检验⽤户是否已经存在。
图⽰:关键代码如下:Public Class dal_DealStudentInfoPublic Function AddRecord(ByVal RecInfo As Student) As Boolean'……'连接数据库'……'……Try'SQL语句向数据库中写⼊数据'……Return TrueCatchReturn FalseFinally'关闭数据库End TryEnd FunctionPublic Function IsExist() As Boolean'查询数据库,如果存在该卡,则返回True,不存在则返回falseIf '存在Return TrueElseReturn FalseEnd IfEnd FunctionEnd Class业务逻辑层BLL:这⾥会有⼀个类bll_ControlStudent与DAL层中的dal_DealStudentInfo类对应,调⽤dal_DealStudentInfo的AddRecord⽅法,这个⽅法传递的参数就是UI层传递过来的studentInfo实体类的⼀个实例。
如果需要验证输⼊合法性,也放在bll_ControlStudent中,并与dal_DealStudentInfo中的⽅法相对应,可以单独⽤⼀个⽅法,也可以集成到AddStudent中,我这⾥因为只是进⾏了简单的判断,就把它放到了AddStudent。
Delphi三层主从表设置

Delphi三层主从表设置三层中主从表的操作(删除、新增、修改)一定要在一个事物中完成,那在Delphi中的事物又如何控制呢?我们在开发客户端时,如果为了在一个事物中而用TSqlConnection 的事物来控制是徒劳的,没有一点意义,因为真正事物控制是在服务端的TDataSetProvider中产生的,它是自动产生事物的,如果有错误产生,它会回滚事物。
当客户端的ClientdataSet把Delta数据提交给远程的DataSetProvider时,这个DataSetProvider会解析这个语句,并且会自动产生一个事物,所以我们不必要写事物控制,当然用函数时而不用DataSetProvider是另外一个话题。
如果我们直接在远程端设置二个TDataSetProvider,客户端也放两个对就的ClientDataSet,并把客户端的两个数据集设置成主从可以吗?我的回答是:绝对不可以。
为什么?因为你在更新数据时是在两个DataSetProvider中产生二个不同的事物,这样的话就不能保证数据更新的完整性。
Delphi为我们提供的机制是在服务端设置好主从结构,而从表数据集变为主表的一个字段,这样当客户端连接远程的TDataSetProvider时,只把客户端主表数据控件连接到DataSetProvider就可以,从表只要设置一下DataSetField为客户端主表中那个数据集字段就可以了。
当保存数据时,只用客户端主表的ApplyUpdata就可以保存主从表数据(可以有多个从表)。
更新时就把主从表相关改动的数据传到远程的DataSetProvider中,些时DataSetProvider可以开启一个事物,这样就能保证数据的完整性。
以下我详细说一下开发主从表的实例:我用的数据集是:ADOQuery,(用SQL Server 2008 r2的hisdb 库中的orders和order detail表做实例)一.开发服务端1. 放上连接数据库的控件:ADOConnection。
DELPHI三层架构设计方案

随便说说最近项目中的三层架构吧。
讲点实际的东西。
我最讨厌空讲道理。
网上讲道理的太多了,不喜欢举例子。
大多数文章中都或多或少的讲到了三层架构。
表示层,业务层,数据层。
又把业务层再细分,分为外观服务层,主业务服务,及数据库库服务层。
今天主要讨论一下业务层吧。
举个最简单的例子。
客户端获取数据。
业务层要与表示层尽量解藕,我的方法是:首先我们在中间层TLB_中定义一个接口IBusinessService, 定义一个方法。
getvoList,我要得到一个VO的列表,VO即V alueObject, 例如:TV alueObject= class(TPersistent)privateb_insertFlag :Boolean;b_updateFlag :Boolean;b_deleteFlag :Boolean;d_rowV ersion :double;procedure setInsertFlag(pInsertFlag :Boolean);function getInsertFlag: Boolean;procedure setUpdateFlag(pUpdateFlag :Boolean);function getUpdateFlag: Boolean;procedure setDeleteFlag(pDeleteFlag :Boolean);function getDeleteFlag: Boolean;procedure setRowV ersion(pRowV ersion :double);function getRowV ersion:double;protectedfunction GetOLEData: OleV ariant; virtual;procedure SetOLEData(const V alue: OleV ariant); virtual;publishedproperty bInsertFlag: Boolean read getInsertFlag write setInsertFlag;property bUpdateFlag: Boolean read getUpdateFlag write setUpdateFlag;property bDeleteFlag: Boolean read getDeleteFlag write setDeleteFlag;property dRowV ersion: double read getRowV ersion write setRowV ersion;property POLEData:OleV ariant read GetOLEData write SetOLEData;end;TUserVO = class(TV alueObject)privateid: string;name: string;password: string;。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
delphi 三层架构简单例子(经测试成功2009-01-22 下午 02:45所谓三层: (1 客户端 (2 服务器端 (3 数据库在数据访问时,使得客户端必须通过服务器来访问数据库。
提高了系统的安全性。
在Delphi中可以使用Socket或者Dcom来连接他们相互间的通讯。
如果使用Scocket在系统使用时必须提供Scocket连接器,而Dcom
则不用。
客户端和服务器的连接需要Broker来联系。
环境为winxp sp2 + delphi 7 + db7.(MSSQL2000 创建过程: 1、请不要新建application.file-new-activex-activex library,file --new--other,选择"Multitier"--"Remote data module"。
在跳出来的对话框里面输入名称(任意),例如:AppSqlConn。
选择确定,进入remote data module窗口。
2、加入组件:adodataset,点击connectionstring属性,点击后面的…,进入
设定连接窗口。
选择:use connection string--build,在提供程序中选择:"Microsoft ole db provider for sql server",在连接中:服务器名称输入sql server的ip地址,登录信息中输入用户名和密码(sql server),在选择数据库中选择自己想要使用的数据库。
一般只要地址正确、用户名和密码无误,肯定可以连接通过。
确定退出。
3、在commandtext中点击后面的…,进入sql 语句设定,根据自己的要求设定。
4、将active属性设置为true。
只要前面的设定是正确的,这里应该顺利通过。
5、加入组件:datasetprovider。
设定其dataset属性为上面的adodataset。
6、到此服务器端已经设置完成。
请保存并且运行一次,从而使服务注册。
7、运行delphi的bin目录下面的scktsrvr,因为下面要使用socket连接。
运行后任务栏中出现socket server的图标。
8、新建程序(application),然后file--new--data module,会创建客户端的data module。
9、加入组件:socketconnection,在address中输入sql server的ip地址,然后在servername中输入刚才创建的remote data module的服务程序。
程序会自动在serverguid中加入id。
然后选择connected属性为true。
只要
此处不报告错误,此程序基本成功了。
10、加入组件:clientdataset,选择remoteserver属性为socketconnection,选择providename为服务器程序的datasetprovider。
然后选择active属性为true。
11、到程序的form窗口状态,首先选择file--use unit,选择上面创建的data module,确定。
然后加入组件datasource
和dbgrid。
选择datasourece的dataset属性为data module的clientdataset,选择dbgrid的datasource为这里的datasource组件。
现在应该可以看到dbgrid的窗口中
出现了想要的数据。
保存并且编译客户端程序。
12、客户端分发软件设定。
从服务器端拷贝midas.dll文件到本机的system(98)或者system32(2000),一般自己就可以注册,否则用regsvr32 midas.dll注册一下。
然后将刚才
客户端程序拷贝过来运行一下,应该可以正常运行。
还有拒绝访问的错误我也碰到过,是没有打开borland socket server,该程序是borland/bin/scktsrvr.exe 注册服务器端时应该使用 run-install mts objects安装到组件服务里,安装完后可以在控制面板-组件服务里找到服务器的GUID,然后填到borland socket server里就可以了。
如果需要code的话,请发mail到tech@ scktsrvr.exe是一个NT 的服务程序,你用scktsrvr.exe -install安装之后,每次系统启动,它都会自动运行的。
如果你的客户端用了socketconnection,每次连接应用服务器的时候,都需要通过scktsrvr.exe才能访问到你的应用服务器. scktsrvr.exe -uninstall 即可卸载midas.dll是个什么文件? 1.数据库三层的文件. 2.TClientDataSet小家碧玉,恐怕人人都喜欢使用。
但是,都知道娶TClientDataSet是有代价的,因为你同时也得面对丈母娘MIDAS.DLL。
3.delphi用来设计多层应用程序的动态库,用来作客户端和服务器连接和处理。
4. Multi-tier distributed application service 多层分布式开发服务midas.dll是它运行时需要的动态连接库。
5.你安装好delphi时装在system32里的,delphi的一个DLL. 能不能使用TClientDataSet又不用MIDAS.DLL呢?很简单,就是uses一下MidasLib单元! MidasLib单元在Delphi6中才有,是Lib目录下的一个dcu文件。
一旦在你的源程序中引用了MidasLib单元,程序运行时就不再需要MIDAS.DLL文件。
然而,编译后程序大小一定会增加200k以上,即使使用包编译模式。