【问题标题】:TClientDataSet Missing Data ProviderTClientDataSet 缺少数据提供者
【发布时间】:2014-10-25 16:17:24
【问题描述】:

这个问题没有任何代码,但我必须寻求帮助,因为我无法解决这个问题。我在 SO 中搜索了类似的问题,发现有几个问题的答案没有帮助我解决这个问题。

我在使用我的主要开发电脑创建 TClientDataSet 项目时遇到问题,因此我尝试在我的 Windows 平板电脑上创建一个项目。两台电脑都运行带有 DelphiXE4 的 windows 8.1。

我在一个新项目中添加了一个 TClientDataSet、一个 TDataSource 和一个 TDatasetProvider。 我在设计时在 FieldDefs 中添加了 3 个字段,然后从 TClientDataSet 的弹出菜单中选择了 CreateDataset。数据集创建得很好,所以我继续添加了一个 TDBGrid,TDBNavigator,输入了一些数据并将 TClientDataSet 保存到一个文件中。

小型演示应用运行良好,没有任何问题。我可以查看和输入数据,保存到文件并从文件中加载,所以我压缩了项目并将其复制到我的开发电脑上。我尝试运行演示,但是当调用 LoadFromFile 时,会发生缺少数据提供程序异常。我尝试删除 xml 文件,然后尝试使用我在平板电脑上使用的相同过程重新创建文件,但我再次收到 Missing Data provider 消息。

在跟进 SO 答案时,我按照几个 SO 答案中的建议将 MidasLib 添加到使用中,但未能解决问题。我搜索了 Midas.DLL 并发现它们存在。

我的问题:dsnap180.bpl 是否可能已损坏或者我的开发电脑中缺少其他东西?我的目标是能够在我的开发电脑上创建和打开一个 TClientDataset。任何建议或指导表示赞赏。

编辑 肯斯演示

过去

    unit Unit1;

    interface

    uses
      Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants,
      System.Classes, Vcl.Graphics, Vcl.Controls, Vcl.Forms, Vcl.Dialogs, Vcl.Grids,
      Vcl.DBGrids, Data.DB, Datasnap.DBClient;

    type
      TForm1 = class(TForm)
        ClientDataSet1: TClientDataSet;
        DataSource1: TDataSource;
        DBGrid1: TDBGrid;
        procedure FormCreate(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
      end;

    var
      Form1: TForm1;

    implementation

    {$R *.dfm}

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ClientDataSet1.FieldDefs.Add('Collection', ftString, 50);
      ClientDataSet1.FieldDefs.Add('Filename', ftString, 200);
      ClientDataSet1.CreateDataSet;
      ClientDataSet1.Active := True;
      ClientDataSet1.AppendRecord(['General', 'D:\Images\Test.jpg']);
      ClientDataSet1.AppendRecord(['General', 'D:\Images\BeachBall.bmp']);
    end;
end.

DFM

object Form1: TForm1
      Left = 0
      Top = 0
      Caption = 'Form1'
      ClientHeight = 299
      ClientWidth = 635
      Color = clBtnFace
      Font.Charset = DEFAULT_CHARSET
      Font.Color = clWindowText
      Font.Height = -11
      Font.Name = 'Tahoma'
      Font.Style = []
      OldCreateOrder = False
      OnCreate = FormCreate
      PixelsPerInch = 96
      TextHeight = 13
      object DBGrid1: TDBGrid
        Left = 0
        Top = 0
        Width = 635
        Height = 299
        Align = alClient
        DataSource = DataSource1
        TabOrder = 0
        TitleFont.Charset = DEFAULT_CHARSET
        TitleFont.Color = clWindowText
        TitleFont.Height = -11
        TitleFont.Name = 'Tahoma'
        TitleFont.Style = []
      end
      object ClientDataSet1: TClientDataSet
        Aggregates = <>
        Params = <>
        Left = 71
        Top = 35
      end
      object DataSource1: TDataSource
        DataSet = ClientDataSet1
        Left = 116
        Top = 34
      end
    end

DPR 程序项目1;

uses
  Vcl.Forms,
  Unit1 in 'Unit1.pas' {Form1};

{$R *.res}

begin
  Application.Initialize;
  Application.MainFormOnTaskbar := True;
  Application.CreateForm(TForm1, Form1);
  Application.Run;
end.

【问题讨论】:

  • 如果您正在编辑您的 q 以遵循 Ken White 的建议,您可能会做的另一件事是将保存的 XML 数据文件添加到您的 q.然后我们可以尝试加载它,看看我们在零代码项目中得到了什么行为。
  • 如果您在未创建数据集且未设置文件名的情况下打开/激活数据集,我知道此异常。
  • 我无法将 xml 文件添加到编辑中,因为应用程序从不创建数据库,因为这是发生异常的地方,
  • 将以上内容复制/粘贴到我机器上的文件中,编译并运行它们可以完美运行(在 D2007 和 XE6 中),我可以在网格中看到数据。我怀疑你的 Delphi 安装出了点问题。

标签: delphi delphi-xe4


【解决方案1】:

以下内容非常适合我:

  1. TClientDataSetTDataSourceTDBGrid 拖放到空白表单上。将网格连接到数据源,将数据源连接到客户端数据集。 (注意没有TDataSetProvider。)

  2. 将以下代码添加到表单的FormCreate 事件中:

    procedure TForm1.FormCreate(Sender: TObject);
    begin
      ClientDataSet1.FieldDefs.Add('FirstName', ftString, 20);
      ClientDataSet1.FieldDefs.Add('LastName', ftString, 20);
      ClientDataSet1.CreateDataSet;
      ClientDataSet1.Active := True;
      ClientDataSet1.AppendRecord(['John', 'Smith']);
      ClientDataSet1.AppendRecord(['Jane', 'Doe']);
    end;
    
  3. 运行应用程序:

MidasLib 添加到uses 子句中,无需将Midas.dll 与您的应用程序一起分发,但它根本不会影响数据集提供程序。

【讨论】:

  • 还可能值得一提的是,使用MidasLib 不一定是完全相同的东西,并且已知存在一些使用 DLL 时不存在的错误和怪癖。
  • @Jerry:如果您没有使用足够高的 SKU(例如,Pro 不包括重新分发它的权利),则部署 Midas.dll 会出现许可问题。我从未遇到过无法解决的 MidasLib 问题。然而,这与这里的问题无关;我提到它的唯一原因是解决 OP 的提及,以确保它与问题中的问题无关。
  • 用你的例子我在这里得到一个例外:procedure TCustomClientDataSet.InternalCheck(Status: DBResult);
  • @Bill:我无法解释,因为我在发布之前测试了我发布的代码(在一个新的空 VCL 应用程序中)。我没有对任何属性进行任何更改,没有对uses子句进行任何添加,也没有做任何这里没有描述的事情(除了减小表单的大小并将网格移动到看到的位置,以使图像更小当我上传它时)。你在这里看到了 100% 的代码。您是在新的空白 VCL 表单应用程序中尝试过,还是将其添加到现有代码中? (续)
  • 我做了一个新项目,和你一样。
【解决方案2】:

问题看起来像 32 位/64 位 Windows 目标平台。如果您以 64 位为目标,它会正常工作。它对我来说很好。 否则您可能需要验证您是否使用 32 位 midas dll

【讨论】:

  • 这不是问题。我的答案中的相同代码适用于 32 位和 64 位平台。 Delphi 附带了这两个版本的 DLL,并且使用 midaslib 会从等式中删除 DLL。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-10
  • 1970-01-01
相关资源
最近更新 更多