Precis:我的代码试图更新Delphi XE TClientDataset中的非物理字段(连接到带有sql属性集的TsqlQuery),这些字段是作为运行时Open命令创建的.

我有一个连接到连接到TsqlConnection的TsqlQuery的TDatasetProvider的TClientDataset.这些对象中的前3个被封装在库中的几个类中,我在几个项目的许多地方使用它们.这些类在运行时创建这3个对象,并消除了大量的重复代码,因为我有很多很多这样的三元组.

通常我会通过在TsqlQuery的sql属性中指定一些sql并在TClientDataSet上调用Open来从数据库加载TClientDataset. TClientDataset中的字段是通过调用Open ie创建的.它们在Open之前不存在.

在TClientDataset中生成的三个字段是非物理的情况下,我遇到了一个问题.也就是说,sql会进行计算以生成它们.不幸的是,在TClientDataset中,这3个字段的创建方式与物理字段没有任何不同;他们的FieldKind是fkData(理想情况下它是fkInternalCalc),Calculated属性是False(理想情况下它是True),它们的ProviderFlags包括pfInUpdate(理想情况下它不应该).毫不奇怪,当需要在TClientDataset上执行ApplyUpdates时,会抛出异常…

Project XXX.exe raised exception class TDBXError with message
sql State: 42S22,sql Error Code: 207 Invalid column name 'Received'.
sql State: 42S22,sql Error Code: 207 Invalid column name 'Issued'.
sql State: 42S22,sql Error Code: 207 Invalid column name 'displayTime'.

我可以通过清除TDatasetProvider的OnUpdateData事件处理程序中的这些字段的pfInUpdate标志来避免此错误.但是,此解决方案要求此函数知道特定的字段名称,该函数位于上述泛型类中,从而破坏了代码的通用性.

我正在寻找的是将这些字段的计算性质用信号通知给事件处理函数的通用方法.

在Open调用之后,我无法更改其FieldKind或Calculated属性(分别为fkInternalCalc和True),因为这会生成WorkCDS:无法对打开的数据集异常消息执行此操作.并且,我无法在Open调用之前更改这些属性,因为Fields还不存在.

我可以在打开后从这些Field的ProviderFlags属性中删除pfInUpdate标志,但这不会传递到到达OnUpdateData事件处理程序的“Delta”TClientDatset.我还尝试设置字段的FieldDefs.InternalCalcField属性;再次,这不会传递到Delta数据集.

所以,我尝试过的所有信号传递方法都没有奏效.我会对任何新想法或替代方法表示感谢.

我遇到的所有互联网搜索结果 – 包括Cary Jensen的优秀文章 – 处理的设计时或非sql生成的设置都不适用于我的情况.

您可以在类中创建一种机制,为要在更新过程中忽略的各个字段预先配置ProviderFlags.

根据您对问题的评论,我建议您在类中创建一个新方法来打开内部ClientDataSet,所有魔法都将在此方法中进行.

首先,一个简单的机制是包含一个新的TStringList属性,该属性列出了您要忽略的所有字段,您将按名称进行匹配.随意采用这个或创建一个新的更好的机制,重要的是你能够识别出你想要配置哪个字段.

type
  TMyClass = class
    // all your current class here
  private
    FUpdateIgnoredFields: TStringList;
  public
    property UpdateIgnoredFields: TStringList read FUpdateIgnoredFields write SetUpdateIgnoredFields;
    //don't forget to create this in your constructor,free it in the destructor
    //and Assign any new value in the SetUpdateIgnoreFields method,as usual.
    procedure OpenInnerCDS; //the magic goes here
  end;

procedure TMyClass.OpenInnerCDS;
var
  FieldName: string;
  AFieldToIgnore: TField;
begin
  //opens the inner cds,but before that,configures the update-ignored  
  //fields in the underlying dataset
  //Let's call it InnerBaseDataSet;
  FInnerBaseDataSet.Open; //this opens the DataSet and creates all the fields for it.
  try
    for FieldName in FUpdateIgnoredFields do
    begin
      AFieldToIgnore := FInnerBaseDataSet.FindField(FieldName);
      if Assigned(AFieldToIgnore) then
        AFieldToIgnore.ProviderFlags := AFieldToIgnore.ProviderFlags - [pfInUpdate,pfInWhere];
    end;
    //Now,let's open the ClientDataSet;
    FInnerClientDataSet.Open;
  finally
    //I suggest no matter what happens,always close the inner data set
    //but it depends on how the CDS->Provider->DataSet interaction is configured
    FInnerBaseDataSet.Close;
  end;
end;

//the way you use this is to replace the current ClientDataSetopen with something like:

var
  MyInsance: TMyClass;
begin
  MyInstance := TMyInstance.Create();  //params
  try
    //configuration code here
    //MyInstance.InnerCDS.Open;  <-- not directly Now
    MyInstance.UpdateIgnoreFields.Add('CALculaTED_SALARY');
    MyInstance.OpenInnerCDS;
    //use the CDS here.
    MyInstance.InnerCDS.ApplyUpdates(-1); //safely apply updates Now.
  finally
    MyInstance.Free;
  end;
end;

把它作为一个想法.

我在这里编写了所有代码,也许语法错了,但它显示了整个想法.

windows – 我需要避免尝试更新连接到TSQLQuery的Delphi TClientDataset中的非物理字段的更多相关文章

  1. ios – 我在哪里可以找到用于创建IPad应用程序的Delphi资源?

    我之前一直在使用Delphi并且一直都是Windows家伙.我的妻子为我的生日买了一台新的iPad,我昨晚第一次使用它.哇!…

  2. 如何从命令行部署OSX或IOS Delphi项目?

    我正在使用像这样的脚本构建我的Delphi应用程序现在我想添加一个选项将应用程序部署到OSX系统修改这样的脚本,那么可以从命令行部署OSX或IOSDelphi项目吗?

  3. 如何检查Android和iOS上的网络是否可用(Delphi XE5)

    解决方法试试这个:

  4. 使用嵌套线程错误终止应用程序

    如果我使用一个启动了嵌套线程的线程,那么终止应用程序时会遇到问题。如果最深的嵌套线程卡住,则应用程序终止时会发生错误。在其他情况下,问题不会出现。据我所知,tSync.Free不会等待TCP.Connect完成并自行关闭。TCP.Connection在超时结束后无处返回。

  5. 通过gsdll32.dll与Delphi 11组合PDF

    我已经使用这个代码10多年了,它突然停止工作。该程序读取一个pdf文件列表,并输出一个包含列表中所有文件的pdf文件。它使用gsapi.pas包装单元。多年来,我只需要从Ghostscript.t下载一个更新版本的gsdll32.dll文件,就可以兼容更新版本的pdf文件格式。我发现他们有了一个新的翻译,也许这与此有关?请注意,在Ghostscript中使用等效的命令行本身效果良好。在我看来,他们改变了调用API的方式。如果有任何帮助,我将不胜感激。我确实尝试了添加开关“-dNEWPDF=false”,但

  6. 如何处理Windows 7的125%或150%放大率(Delphi)

    Windows7已添加其控制面板,外观和个性化,显示设置,放大文本和其他项目125%或150%的功能.完成后,我的Delphi2009程序的表单和对话框的一些内容被切断.我需要做些哪些更改才能确保在Windows7的任何放大设置下,我的所有表单和对话框都能正常显示.这听起来像是指文本大小设置,它在Windows中以各种形式存在多年,Delphi形成了与此设置的交互以及它们的自动缩放.我没有在这里检

  7. Windows 10中的内存泄漏Delphi Seattle中的TNotification?

    我正在我的应用程序中实现Windows10通知.但是,下面的代码显然会给出1个TNotification对象和2个字符串的备忘录泄漏,但我在块的末尾释放了对象:我做了一些愚蠢的事情,或者在通知的实施中是否存在内存泄漏?

  8. windows – Delphi中的跨应用程序拖放

    我想为WindowsXP创建一个Delphi应用程序,它允许删除从Windows资源管理器或其他支持此操作的应用程序拖动的文件.反之亦然?当用户从我的应用程序中拖动图标时,我应该能够将拖动对象的内容设置为自定义数据.我的目标是创建一个自定义应用程序工具栏,我可以在其上删除应用程序并显示其图标或从中拖动应用程序或其他实体.如何才能做到这一点?

  9. windows – 我需要避免尝试更新连接到TSQLQuery的Delphi TClientDataset中的非物理字段

    Precis:我的代码试图更新DelphiXETClientDataset中的非物理字段(连接到带有sql属性集的TsqlQuery),这些字段是作为运行时Open命令创建的.我有一个连接到连接到TsqlConnection的TsqlQuery的TDatasetProvider的TClientDataset.这些对象中的前3个被封装在库中的几个类中,我在几个项目的许多地方使用它们.这些类在运行时创

  10. 是默认情况下能够处理vista / win7 UAC的delphi 2010程序

    或者你必须自己包括它?如果是,给你什么级别的特权?我的程序修改了一个注册密钥,它可以在没有对.res文件进行任何修改的情况下这样做吗?一个附带问题:是否有一个组件/专家可以像delphi2010一样自动生成/包含.res文件在我的delphi7和delphi2007项目中?

随机推荐

  1. static – 在页面之间共享数据的最佳实践

    我想知道在UWP的页面之间发送像’selectedItem’等变量的最佳做法是什么?创建一个每个页面都知道的静态全局变量类是一个好主意吗?

  2. .net – 为Windows窗体控件提供百分比宽度/高度

    WindowsForm开发的新手,但在Web开发方面经验丰富.有没有办法为Windows窗体控件指定百分比宽度/高度,以便在用户调整窗口大小时扩展/缩小?当窗口调整大小时,可以编写代码来改变控件的宽度/高度,但我希望有更好的方法,比如在HTML/CSS中.在那儿?

  3. 使用Windows Azure查询表存储数据

    我需要使用特定帐户吗?>将应用程序部署到Azure服务后,如何查询数据?GoogleAppEngine有一个数据查看器/查询工具,Azure有类似的东西吗?>您可以看到的sqlExpressintance仅在开发结构中,并且一旦您表示没有等效,所以请小心使用它.>您可以尝试使用Linqpad查询表格.看看JamieThomson的thispost.

  4. windows – SetupDiGetClassDevs是否与文档中的设备实例ID一起使用?

    有没有更好的方法可以使用DBT_DEVICEARRIVAL事件中的数据获取设备的更多信息?您似乎必须指定DIGCF_ALLCLASSES标志以查找与给定设备实例ID匹配的所有类,或者指定ClassGuid并使用DIGCF_DEFAULT标志.这对我有用:带输出:

  5. Windows Live ID是OpenID提供商吗?

    不,WindowsLiveID不是OpenID提供商.他们使用专有协议.自从他们的“测试版”期结束以来,他们从未宣布计划继续它.

  6. 如果我在代码中进行了更改,是否需要重新安装Windows服务?

    我写了一个Windows服务并安装它.现在我对代码进行了一些更改并重新构建了解决方案.我还应该重新安装服务吗?不,只需停止它,替换文件,然后重新启动它.

  7. 带有双引号的字符串回显使用Windows批处理输出文件

    我正在尝试使用Windows批处理文件重写配置文件.我循环遍历文件的行并查找我想要用指定的新行替换的行.我有一个’函数’将行写入文件问题是%Text%是一个嵌入双引号的字符串.然后失败了.可能还有其他角色也会导致失败.如何才能使用配置文件中的所有文本?尝试将所有“在文本中替换为^”.^是转义字符,因此“将被视为常规字符你可以尝试以下方法:其他可能导致错误的字符是:

  8. .net – 将控制台应用程序转换为服务?

    我正在寻找不同的优势/劣势,将我们长期使用的控制台应用程序转换为Windows服务.我们为ActiveMQ使用了一个叫做java服务包装器的东西,我相信人们告诉我你可以用它包装任何东西.这并不是说你应该用它包装任何东西;我们遇到了这个问题.控制台应用程序是一个.NET控制台应用程序,默认情况下会将大量信息记录到控制台,尽管这是可配置的.任何推荐?我们应该在VisualStudio中将其重建为服务吗?我使用“-install”/“-uninstall”开关执行此操作.例如,seehere.

  9. windows – 捕获外部程序的STDOUT和STDERR *同时*它正在执行(Ruby)

    哦,我在Windows上:-(实际上,它比我想象的要简单,这看起来很完美:…是的,它适用于Windows!

  10. windows – 当我试图批量打印变量时,为什么我得到“Echo is on”

    我想要执行一个简单的批处理文件脚本:当我在XP中运行时,它给了我预期的输出,但是当我在Vista或Windows7中运行它时,我在尝试打印值时得到“EchoisOn”.以下是程序的输出:摆脱集合表达式中的空格.等号(=)的两侧可以并且应该没有空格BTW:我通常在@echo关闭的情况下启动所有批处理文件,并以@echo结束它们,所以我可以避免将代码与批处理文件的输出混合.它只是使您的批处理文件输出更好,更清洁.

返回
顶部