【问题标题】:Delphi Paradox database - making duplicate of record | Key violation errorDelphi Paradox 数据库- 复制记录|密钥违规错误
【发布时间】:2018-12-22 06:53:01
【问题描述】:

我需要将数据导入旧发票程序的数据库。这项技术似乎过时了,但我并不气馁,也许有人会告诉我一个解决方案。

我从 Delphi 2005 中的组件创建(我可以访问它,并且我为 Paradox 找到了一些关于它的文档) TTable(名称:ParadoxTable)、TDataSource(ParadoxDataSource)和 TDBGrid,所有内容在运行后绑定并指向正确的数据库命令 ParadoxTable.Active := True;在 TDBGrid 中,一切都正确显示。我可以手动添加记录,存储记录等。但是当我尝试用代码实现时,我每次都会收到一条消息

密钥违规。 索引:DPN_UNQ

但我在表头中没有这样的名称(第一个唯一列是 DPN_ID)。

从忘记的论坛代码中提取后,我添加了一行包含唯一编号的分配以防万一(而且,没有这个标尺效果是一样的):

  ParadoxTable.disablecontrols;
  // Create a variant Array
  aField := VarArrayCreate(
               [0,ParadoxTable.Fieldcount-1],
                             VarVariant);
  // read values into the array
  for i := 0 to (ParadoxTable.Fieldcount-1) do
  begin
     aField[i] := ParadoxTable.fields[i].Value;
  end;
  aField[0] := '5'; // this added line of course changed nothing

  ParadoxTable.AutoCalcFields := True;
  ParadoxTable.Append;
  // Put array values into new the record
  for i := 0 to (ParadoxTable.Fieldcount-1) do
  begin
     if (ParadoxTable.fields[i].CanModify) then 
       ParadoxTable.fields[i].Value := aField[i];
  end;
  ParadoxTable.Post; // here i got exception error
  ParadoxTable.enablecontrols;

结果,如附图所示,添加了一条记录(当我使用 ParadoxTable.Post; 省略行时),没有添加唯一编号,并且所有尝试确认和接受此记录的手动操作都会触发密钥违规错误我绝对不能为第一个变量/列赋值。

我也试过了

  for i := 0 to (ParadoxTable.Fieldcount-1) do
  begin
    if  ParadoxTable.fields[i].Name<> 'DPN_ID' then
     if (ParadoxTable.fields[i].CanModify) then
       ParadoxTable.fields[i].Value := aField[i];
  end;

还有

for i := 1 to (ParadoxTable.Fieldcount-1) do // with omiting first [0] aField
  begin
    if  ParadoxTable.fields[i].Name<> 'DPN_ID' then
     if (ParadoxTable.fields[i].CanModify) then
       ParadoxTable.fields[i].Value := aField[i];
  end;

每次都具有相同的效果。我究竟做错了什么?还有什么简单的方法吗?我将所有搜索都传递到了第三个谷歌页面;)并且没有代码正常工作。我尝试将它们导入到的程序中有许多这样的数据库,这就是为什么从 MS Acess 打开它们的问题会失败的原因。

如有必要,我可以访问较新版本的 Delphi / RAD,但我没有在其中找到 TTable 组件,其中描述了我在网络中找到的有关 Paradox 数据库的所有信息。也许我应该对其他方法感兴趣?例如,也许在较新版本的 Delphi 中,使用其他组件更容易解决这个问题?

提前感谢您的指导。

【问题讨论】:

  • 如果插入不同的“NAZWA”,例如“Nazwa_test”,错误是否相同?我怀疑字段“NAZWA”有一个唯一索引...
  • 对于较新版本的 Delphi,您可以从其他下载中安装 BDE(请参阅您在 edn.embarcadero.com 中的帐户),这样您即使在东京也可以使用 BDE 和 TTable。问题是用于 Paradox/BDE 管理的数据库桌面应用程序,它在最新版本的 Win10(1709 及更高版本)中不起作用。
  • 是的!有用!我改变了行: aField[1] := 'NAME_'+IntToStr(Random(100));现在效果很好。是否有任何价值我可以阅读并知道这个变体是独一无二的,比如“canmodify”?或者我该如何检查它?谢谢! :) :) :)
  • 您可以先尝试在“NAZWA”中找到给定的值。当它存在时,修改记录(如果适用),当它不存在时,添加新记录。 “Canmodify”讲述的是字段,而不是特定的记录/行 (docwiki.embarcadero.com/Libraries/Tokyo/en/…)。

标签: database delphi paradox


【解决方案1】:

您的代码看起来正确。由于设计的数据库约束,插入失败。

可能该表在“NAZWA”和“JM”字段或“DPN_ID”、“DPN_UNQ”和“NAZWA”字段上有一个名为“DPN_UNQ”的复合唯一维护二级索引。这将阻止插入您的第五个测试记录。当然,如果索引还包括其他字段,那么您可以通过在这些字段中添加区分值来插入记录。

您需要先了解更多有关表结构的信息,然后才能知道如何约束数据以进行插入。

Paradox 数据库不需要包含模式表。一些设计人员和 DBA 会将他们的文档写入 INFORMATION_SCHEMA.db 或类似的文件中,但 BDE 不会检查此表是否有错误。除非在表本身之外正确记录,否则 Paradox 数据库通常是无用的。

正如@zdzichs 所指出的,Delphi 传统上附带一个数据库桌面实用程序,它基本上是一个重新标记的 Windows 悖论。使用此实用程序,您可以检查任何表的结构,包括约束和二级索引。

【讨论】:

  • 你读过我的问题下面的cmets吗?当然是的;)除了更广泛的阐述之外,您的答案与他们有何不同?再一次:所有 Delphi 版本都包含数据库桌面,足以检查数据库结构。在较新的版本(包括东京)中,这只是一个额外的下载。
  • 感谢您提供信息。我是否理解正确,我需要使用例如 TDatabase 组件来检查这个数据库?
  • 只需将表逐个加载到数据库桌面,按重组按钮并检查字段和索引。请记住,您需要 win-10 之前的 Windows 版本才能运行该实用程序(虚拟机可以,旧的 XP 或 Vista 机器也可以)。
猜你喜欢
  • 1970-01-01
  • 2017-01-11
  • 1970-01-01
  • 2017-11-13
  • 2018-12-25
  • 2017-07-05
  • 2012-02-12
  • 1970-01-01
  • 2021-06-22
相关资源
最近更新 更多