`

ClientDataSet的使用提交问题

阅读更多

 

 

 

转自:http://faq.csdn.net/read/37602.html

 

 

问题一: 我在三层结构下做主从表,在服务器用的是巢状结构来关联主从结构,客户端用clientdataset的insert和applyupdates来提交,但主表数据可以正常提交写入数据库,但从表毫无动静,也就是说从表能写入clientdateset的缓存,但不能写入数据库,不管是用applyupdata(-1)还是用applyupdate(0)都是这样,请教各位老大这是什么原因?
问题二:有时候用clientdataset的edit方法和delete方法修改数据的时候程序会出错,提示说:不能执行该操作,该记录已被别人修改,(但实际上只有我一个人使用,并没有修改数据),不知这是什么原因?
我只是用clientdataset的insert,edit 再applyupdata的方法对一个数据表table1的abc纪录进行操作,然后由于某种需要,我用另一个clientadaset(专门执行sql语句的公用clientdataset)的commandtext执行一个更新此table1表中abc纪录的操作而已。
问题三:在问题二中,是不是用了clientdataset的insert,edit方法以后,就最好不要再用commandtext方法提交数据阿?我向别人请教,他说最好要么一直用clientdataset的insert,edit方法,要么一直用commandtext提交insert,update语句
问题四:用clientdataset的方法增删改数据时,有时候会提示:Cannot find record,No key specified. 我不知道这是什么原因引起的?有人说要加主键,但我的数据库表已经有主键,有人说是因为我的数据库表中有一个字段是设定自动增一的,又有的人说只需设置datasetprovider的某个属性就行了,莫衷一是,请各位先悟道者给个权威说法  :)
---------------------------------------------------------------

1)应该用applyupdate(0);出现不能提交的原因,主要是Delphi无法解析主从表的表名。只要在DataSetProvider中的OnGetTableName事件中写代码:
if (DataSet = qryMaster) then
  TableName := 'MasterTableName'
else if (DataSet = qryDetail) then
  TableName := 'DetailTableName';
这样就可以了。
---------------------------------------------------------------

Midas进阶 - 巢状数据表实现Master/Detail的应用系统
首先,还应该知道Master/Detail到底是什么关系;
其次,要明白什么是巢状数据表是什么意思;
Master/Detail这种主细关系,只要做过数据库程序的人应该都知道,在C/S结构里随时都是,很长见的;
巢状数据表应该如何理解?它就是分布式系统和C/S结构的对于Master/Detail的不同操作机制而引申的;从客户端而言,在C/S结构中,Master/Detail可以用两个数据集组件分别取出表中具有Master/Detail关系的数据,但是在分布多中,对于客户端而言,我们只关心Master的数据集的处理方式,而如何对应Master/Detail则是在应用服务方面进行操作,当我们正确连接了客户端的MasterClinetDataSet(TClientDataSet)时,其所对应的Detail就会随着数据包自动的下载到客户端,这就是巢状数据表的初步解释;而它的正真定义应该是:当数据封包在封装数据时,这个数据封包甚至能够把一个数据集封装起来;
下边用一个例程来说明:
应用服务端:在应用服务器上要实现两个数据组件的M/D(Master/Detail,以后用M/D代替)的关系,可以用TTable or TQuery ,TADOQuery or TADOTable or TADODataSet组件都完全可以;这儿要建立它们的M/D关系,和C/S中的完全一样(中间需要通过一个TDataSource连接);

客户端:在客户端只需要用一个TClientDataSet来接收数据,这儿更能体现“巢状“,所谓的接收数据是从应用服务端下载数据,是将M/D数据都下载下来,这后,Delphi可以自动的识别这是一个M/D结构的;此时需要将另一个TClientDataSet组件加进来,而且要设置它的DataSetField为下载数据的TClientDataSet中的Detail数据字段(可以这样理解);但不应该忘记了要执行TClientDataSet.Fetch Params,只有这样才可以实现Detail -> TClientDataSet的DataSetField的设置;

设置完成后,就可以正确运行了;
下边我给出设置实例,供参考
应用服务端窗体文件如下:
object DMF_LX: TDMF_LX
  OldCreateOrder = False
  Left = 192
  Top = 107
  Height = 409
  Width = 570
  object ADOConnection1: TADOConnection
    Connected = True
    ConnectionString = 
      'Provider=SQLOLEDB.1;Persist Security Info=True;User ID=sa;Initia' +
      'l Catalog=pubs;Data Source=(local)'
    /////数据连接字符串,有必要看一看;
    LoginPrompt = False
    Provider = 'SQLOLEDB.1' 
    Left = 72
    Top = 32
  end
  object MADODataSet: TADODataSet
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select * from publishers'
    Parameters = <>
    Left = 64
    Top = 104
    object MADODataSetpub_name: TStringField
      FieldName = 'pub_name'
      Size = 40
    end
    object MADODataSetcity: TStringField
      FieldName = 'city'
    end
    object MADODataSetstate: TStringField
      FieldName = 'state'
      FixedChar = True
      Size = 2
    end
    object MADODataSetcountry: TStringField
      FieldName = 'country'
      Size = 30
    end
  end
  object DADODataSet: TADODataSet
    Connection = ADOConnection1
    CursorType = ctStatic
    CommandText = 'select * from titles'
    DataSource = MDDataSource
    IndexFieldNames = 'pub_id'/////////这儿建立关系;
    MasterFields = 'pub_id'  /////////这儿建立关系;
    Parameters = <>
    Left = 168
    Top = 104
  end
  object GADODataSet: TADODataSet
    Connection = ADOConnection1
    Parameters = <>
    Left = 272
    Top = 104
  end
  object MDDataSource: TDataSource
    DataSet = MADODataSet
    Left = 264
    Top = 32
  end
  object MDataSetProvider: TDataSetProvider
    DataSet = MADODataSet
    Constraints = True
    Left = 64
    Top = 168
  end
  object DDataSetProvider: TDataSetProvider
    DataSet = DADODataSet
    Constraints = True
    Left = 176
    Top = 168 
  

分享到:
评论

相关推荐

    深度解析ClientDataSet

    例如,当用户更改了数据但尚未提交时,这些更改会存储在CDS的内存副本中。如果需要撤销更改,可以利用CDS的日志功能,它记录了所有的修改,以便在下次加载数据时恢复原始状态。 CDS的强大之处在于其数据复制技术。...

    delphi添加修改删除

    在进行数据操作时,应考虑可能出现的错误,如网络问题、权限问题或数据冲突等。通过设置组件的OnError事件,可以捕获并处理这些异常。 7. 界面交互 TDBGrid组件通常用于显示数据,用户可以直接在网格中编辑记录。...

    DBGRIDEH 增加 checkbox

    一个常见的解决方案是使用ClientDataSet组件。ClientDataSet不直接连接到数据库,而是作为一个内存中的数据缓冲区。你可以添加一个名为IsSelected的虚拟字段(VirtualField),它不对应任何物理数据库字段,只在...

    Delphi 从内存中修改数据源码示例

    // 提交更改 end; ``` 在实际应用中,我们通常会将这些内存中的数据与数据库交互,比如使用 ADO 或 BDE 组件进行数据的读取和写回。Delphi 提供的 DBExpress 和 FireDAC 驱动库支持多种数据库系统,包括 MySQL、...

    Delphi in Depth: ClientDataSets

    在ClientDataSet中,BeforeUpdate事件可以用来检查或修改即将被提交的记录,实现数据验证和预处理。 3. **CDSNavigation**:这部分内容可能关注于ClientDataSet的导航功能,包括记录的前进、后退、首记录和末记录...

    白皮书:Delphi2009中新的DataSnap

    接下来,我们对数据进行了编辑(将某一行的“Salary”字段设为50000),并提交更改。最后关闭数据集。 #### 小结 通过上述示例,我们可以看出DataSnap2009为开发者提供了更简洁、高效的多层应用开发方式。它摆脱了...

    Delphi FireDac Delta 记录操作日志 与 Delta转SQL

    本文将详细讲解如何使用 FireDAC 的 Delta 功能来记录操作日志以及如何将 Delta 转换为 SQL 语句,这对于数据库的版本控制、数据审计和错误恢复具有重要意义。 首先,让我们了解什么是 Delta。在 FireDAC 中,Delta...

    BCB blog2

    - **命令文本问题**:解决使用dbExpress时可能遇到的SQL语法问题。 - **只读与单向数据集**:dbExpress支持只读或单向数据集,这对于某些应用场景非常有用。 - **TClientDataSet救急**:当遇到dbExpress的限制时,...

    Delphi批量更新SQL数据库内容..rar

    4. **数据适配器和数据集**:Delphi中的TClientDataSet组件可以用来缓存数据库数据,进行离线编辑,然后一次性将更改提交回数据库。这种方式适合于大量数据的本地处理。 示例: ```delphi ClientDataSet1....

    服务端(JAVA Servlet ) + 客户端( Delphi xe8 ) 三层开发

    - **编码问题**: 如果使用的是Delphi较旧版本,默认编码可能与JSON数据不匹配,需要先将JSON数据转换为UTF-8编码。 ##### 5. **数据展示** - **ClientDataset**: 将JSON数据转换为`ClientDataset`后,可以通过`...

    Devart_SQL_Server_Data_Access_Components_SDAC_for_Delphi_8.0.2_D6-XE10.2

    修复ClientDataSet的主/明细关系的错误(O2423) 修复了OutOfMem(1979)的一些错误 2.30 30-Sep-02 Delphi 7支持 ftString和ftVarBytes类型的新内存管理模型。允许显着减少大型表提取时的内存使用量。由FlatBuffers...

    XE4+QuickBurro移动三层架构编程指南

    **3.3.4 ClientDataset集中提交** - **ApplyUpdates**: 应用更新到数据库。 **3.3.5 存储过程调用** - **ExecSQL**: 执行SQL语句。 - **ExecQuery**: 执行查询语句并返回结果集。 **3.3.6 键值生成** - **...

Global site tag (gtag.js) - Google Analytics