Interbase中,记录修改,出现Multiple Records Found,but only one was expected.错误 为什么??(120分

  • 主题发起人 主题发起人 pie
  • 开始时间 开始时间
P

pie

Unregistered / Unconfirmed
GUEST, unregistred user!
Interbase中,记录修改,出现Multiple Records Found,but only one was expected.错误 为什么??(120分)<br />1、Interbase数据库中,当记录内容相同时,对该记录修改、删除,均出现
Multiple Records Found,but only one was expected.
错误报告。 为什么???请解释!!

2、在程序中如何避免?
添加或修改记录时 如何避免出现相同的记录?
在beforepost事件里吗??

3、我用 showMessage(IntTostr(table1.RecNo));
显示当前记录号, 为何总显示 —1??????
 
关于3:
我刚看了 http://www.gislab.ecnu.edu.cn/delphibbs/DispQ.asp?LID=153475
但是我想既然有这个table1.RecNo 属性 为何不能用??难道只能在FOXBASE 之类的数据库系统中使用??
 
在你的表中存在完全相同(除了BLOB类型)的记录,如你在表中设
立一个主键,就可以了
 
1。你的表中有两条以上完全相同的记录。
2。设置一个Primary Key的字段.
3。Interbase的RecNo总是返回-1的。
 
对于1、2:
我在一本书上看到:
&lt; 超键(supper key)指能唯一识别元组(记录)的属性(字段)。
&lt; 候选键(candidate key):人一个属性集能唯一识别元组,且不包含多余的属
&lt;性,那么这个属性集 称为候选键。
&lt; 主键(primary key):用户正在使用的候选键。

那么请问:你们所说的 “设置一个Primary Key的字段” 就是指这个了???

那么如何设置呢?

是不是在库中加入多加一个字段,第一个设置为1 ,后面依次为2、3、4、5...
以后 程序中 在afterInsert和afterAppend 事件中自动将此字段值设置为:
前一个值+1

否则也会出现完全相同的记录,又出错。。。。连Database Desktop 和
SQL Explorer 也报告 错误!!但是他们制造错误根源的时候怎么不及时cancel??

最后我只好 现学SQL语言 用InterBase Windows ISQL 删除此记录!!
既然如此麻烦!!数据库系统自身怎么不进行维护??

是不是其他数据库系统也是这样??!!!!!!!!我们是不是该放弃Interbase ?????????

对于3:
请问其他数据库系统如MS SQL是不是也 RecNo总返回-1??
另外顺便问一下谁知道 Microsoft SQL Server 7.0 的SA缺省密码是什么???
 
在大批数据insert ,在某一时刻会出现Multiple Records,
在insert 之前可以加一段代码
for i:=1 to 10000 do
begin
if &lt;&gt; then exit
end
 
1、你这可能是有两条以上相同的数据,建议加一个主键。
2、有两个方法可以避免数据重复(一定要一个主键):
(1)、在AfterPost事件为:
try
table1.post;
except
messagedlg('数据重复');
end;
(2)、在beforpost事件为:
with query1 do
begin
close;
sql.clear;
sql.add('select count(*) from table1 where f1=:f1 and id1&lt;&gt;:id1');
parambyname('f1').AsString:=table1f1.value;
parambyname('id1').AsFloat:=table1id1.value;
open;
end;

if query1.fields[0].asinteger&gt;0 then
begin
messagedlg('数据重复');
end;
 
Fstao兄:
您的方法我试了,不行。
(1) 是在发生错误后才执行!
(2)此句sql.add('select count(*) from table1 where f1=:f1 and id1&lt;&gt;:id1');中
f1 ID1 是字段名吧??where f1=:f1 and id1&lt;&gt;:id1 如何解释??

if query1.fields[0].asinteger&gt;0 then中fields 就是count(*)吧??我想。
请指教!
谢谢!

我明白 主键 的重要性了!!!它可以避免这些问题!!
但是 用了主键以后 出现问题以后 程序DBE 一定会报告错误。
因为只有post 才能知道 出了错误,
而出了错误 DBE 就会报告!!那么请问:
如何捕获 错误信息呢??
在什么 事件中进行??
以及各错误号是什么意思??
如何处理这些错误??
有谁 能提供!!!!!
 
zmingguang51
您是打算延时?????????
 
Fstao兄:你怎么不回答我???

另外到底应该 在什么 事件中进行检查主键值 为好????

&lt;html&gt;&lt;a href="Dispuser.asp?UserName=pie"&gt;pie&lt;/a&gt;&lt;/html&gt;感谢dxg791给我的汉化!!
 
1.sql 数据库判别数据是哪条是有以下方法:
A.主键
B.所有数据
C.被修改数据+主键
如果所有数据都相同,又无主键,数据库会报错,无法完成指定操作,任何大型数据库都一样。

2.当然,建立个主键,没有合适的,用生成器做个自增的(IB),MSSQL等有现成的自增类型

3.大型数据库不支持这样的东西了,所以返回-1,可以参阅已答问题,有详细解释。
可以自己维护一个RECNO列,不过工作量不小,而且没必要。
 
肯定行的。我一直用这两种方法。
(1)、在AfterPost事件为:
try
table1.post;
except
messagedlg('数据重复');
end;

第一、直接运行编译好的Exe文件,它就会自动捕捉错误信息,不会出现BDE错误信息。
第二、如果不运行Exe文件,而在IDE运行,则把tools-&gt;debugger options中去掉
integrated debugging就行了。

(2)、在beforpost事件为:
with query1 do
begin
close;
sql.clear;
sql.add('select count(*) from table1 where f1=:f1 and id1&lt;&gt;:id1');
{f1和id1为字段名,假如f1是你要求避免的数据重复,id1则为序列号,一般为自增
字段。为何要id1&lt;&gt;:id1,你自己试一试就知道了。}
parambyname('f1').AsString:=table1f1.value;
parambyname('id1').AsFloat:=table1id1.value;
open;
end;

if query1.fields[0].asinteger&gt;0 then
{当发现counts(*)&gt;0时,则就报出数据重复。}
begin
messagedlg('数据重复');
end;

以上两个方法是肯定行的,我用了这么久,都没有出现错误。

 
fstao:
1、不完整吧?如果是其它错误怎么办?
2、太消极了吧?如果确实有两条一样的数据怎么办?效率也低呀。用个KEY吧
 
CJ:
对于1,3我明白了!!非常感谢您及各位!
对于2 ???
CJ 说:2.当然,建立个主键,没有合适的,用生成器做个自增的(IB),MSSQL等有现成的自增类型
请问如何&lt;b&gt; 用生成器做个自增的(IB)&lt;/b&gt;,MSSQL等有现成的自增类型
虽然我试了,但是没找到 我还是个初学者。
fstao:您的注释我明白了!!谢谢
但是对于&gt;&gt;&gt;&gt;(1)、在AfterPost事件为:
&gt;try
&gt;table1.post;
&gt;except
&gt;messagedlg('数据重复');
&gt;end;
????????
李维《Delphi3.0从入门到精通》93 页讲:VCL中
procedure TDataSet.Post;
begin
UpdateRecord;
case State of
dsEdit, dsInsert:
begin
DataEvent(deCheckBrowseMode, 0);
CheckRequiredFields;
DoBeforePost; //beforPost 事件???
CheckOperation(InternalPost, FOnPostError);
FreeFieldBuffers;
SetState(dsBrowse);
Resync([]);
DoAfterPost; //AfterPost 事件??
end;
end;
end;


那么fstao:您这不是产生死循环了??我看不行。大家说说 这是怎么回事??
又见:
procedure TDataSet.CheckOperation(Operation: TDataOperation;
ErrorEvent: TDataSetErrorEvent);
var
Done: Boolean;
Action: TDataAction;
begin
Done := False;
repeat
try
UpdateCursorPos; //???????????
Operation; //InternalPost ????????
Done := True;
except
on E: EDatabaseError do
begin
Action := daFail;
if Assigned(ErrorEvent) then ErrorEvent(Self, E, Action);
if Action = daFail then raise;
if Action = daAbort then SysUtils.Abort;
end;
end;
until Done;
end;

到底应该在哪里捕获错误???????
 
fstao 对您的疑问 答案基本明白! 谢谢各位!
参见&lt;a http://www.delphibbs.com/delphibbs/DispQ.asp?LID=112494&gt; 这里&lt;/a&gt;
 
多人接受答案了。
 
后退
顶部