【发布时间】: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/…)。