向SQLSERVER提交一条数据,如何进行出错回应? 这个问题很难吗?没有人会吗?大富翁里没有高手了?不可能吧!!高手帮忙吧!!! (100分)

  • 主题发起人 主题发起人 wangwei200208
  • 开始时间 开始时间
W

wangwei200208

Unregistered / Unconfirmed
GUEST, unregistred user!
如果两个字段多不允许重复,在这时提交了一条某个字段重复的数据,此时
数据库会报错,通过错误处理,如何知道那个字段重复了?

query1.sql.clear;
query1.sql.add('insert into aaa(a1,a2,a3) values(:v0,:v1,:v2)');
query1.Parameters[0].Value:='aaa';
query1.Parameters[1].Value:='bbb';
query1.Parameters[2].Value:='ccc';
try
query1.execsql;
except
请在这里插入判断错我类型的代码!!
感谢加入代码的朋友!!
分数不够,可以再加!!
end;
其中a1,a2不允许重复
例如:
a1 a2
111 222
111 bbb <----错误的纪录1
ddd 222 <----错误的纪录2

添加上述 错误的纪录1 时报错,如何得知a1重复?
添加上述 错误的纪录2 时报错,如何得知a2重复?

能否给出具体一些的方法?谢谢!!
 
procedure TDBMDIChildForm.DataSetPostError(DataSet: TDataSet;
E: EDatabaseError; var Action: TDataAction);
//提交错误,确认放弃
Const
SErrorInfo = '错误信息:%s';
begin
inherited;
if application.MessageBox(pchar(format(SErrorInfo,[e.message])),Caption,
MB_YESNO+MB_ICONQUESTION)=ID_YES then
DataSet.Cancel;
Action:=daAbort;
end;
 
我使用QUERY直接用SQL语句写入数据!!如何做呢?
 
function GetLastErrorString:string;
//取得最后的错误信息
begin
with MainDMForm.CNMain.Errors do //MainDMForm为数据模块,CNMain为ADO连接
if Count>0 then //如果错误数大于0
result:=Item[Count-1].Description; //取得描述
end;
 
90. Delphi中获得BDE、ADO的错误号
Delphi的数据库对象,如Ttable和TadoTable有以下一些Error事件:OnDeleteError、OnDeleteErro、OnPostError。这些事件的定义如下,都是数据集错误:
type TDataSetErrorEvent = procedure(DataSet: TDataSet; E: EDatabaseError; var Action: TDataAction) of object;
property OnPostError: TDataSetErrorEvent;

在这些事件在EdatabaseError中是无法得到错误号的,其中只有Message属性。在发生BDE错误时可如下得到错误号:
if E is EDBEngineError then
showmessage(inttostr(EDBEngineError(E).Errors[0].ErrorCode));
也可以这么写:
if E is EDBEngineError then
showmessage(inttostr((E As EDBEngineError).Errors[0].ErrorCode));
但在发生ADO错误时不能这样: E is EadoError。
其实Ado错误在数据集相应的数据库连接中都有:TadoConnection.Errors。
procedure TForm1.Table1PostError(DataSet: TDataSet; E: EDatabaseError;
var Action: TDataAction);
var
i:integer;
begin
memo1.Lines.Add(inttostr(table1.Connection.errors.count ));
for i:=0 to AdoConnection1.errors.count-1 do
begin
memo1.Lines.Add('number:'+inttohex(AdoConnection1.errors.Number,8 ));
memo1.Lines.Add('NativeCode:'+inttostr(AdoConnection1.errors.NativeError ));
memo1.Lines.Add(inttostr(AdoConnection1.errors.HelpContext ));
memo1.Lines.Add(AdoConnection1.errors.Source );
memo1.Lines.Add(AdoConnection1.errors.SQLState );
memo1.Lines.Add('Description:'+AdoConnection1.errors.Description );
end;
memo1.Lines.Add('error Msg :'+e.message);
end;
NativeError是Foxpro的原生错误号,非常详细,一般用这个来判断发生的错误。Number是Sql错误号,是大的分类,一般一个Number和多个NativeError对应。
这些错误码的信息在文档Drvvfp.hlp中都有。

 
to ysai
我试了你的方法,但是出错!!
query1.sql.clear;
query1.sql.add('insert into aaa(a1,a2,a3) values(:v0,:v1,:v2)');
query1.Parameters[0].Value:='aaa';
query1.Parameters[1].Value:='bbb';
query1.Parameters[2].Value:='ccc';
try
query1.execsql;
except
请在这里插入判断错我类型的代码!!
感谢加入代码的朋友!!
分数不够,可以再加!!
end;
其中a1,a2不允许重复
例如:
a1 a2
111 222
111 bbb <----错误的纪录1
ddd 222 <----错误的纪录2

添加上述 错误的纪录1 时报错,如何得知a1重复?
添加上述 错误的纪录2 时报错,如何得知a2重复?

能否给出具体一些的方法?谢谢!!
 
[h1]'insert into aaa(a1,a2,a3) values(:v0,:v1,:v2)');[/h1]
试用以下代码:
IF NOT EXISTS(SELECT a1 FROM aaa WHERE a1= :v0 or a2:=v1 ) THEN
insert into aaa(a1,a2,a3) values(:v0,:v1,:v2)')
它应该可直接跳过重复的字段,插入数据到表aaa中!
祝好运!
 
create trigger dup on tablename for insert,update
as
declare @rowcount int
select @rowcount=count(*) from tablename,inserted
where tablename.a1=inserted.a1 if @rowcount>1
begin
rollback tran
raiserror('A1 重复',16,1)
end
select @rowcount=count(*) from tablename,inserted
where tablename.a2=inserted.a2
if @rowcount>1
begin
rollback tran
raiserror('A2 重复',16,1)
end
//更新的试一下
 
to who am i?:你说的方法我试过了,但是不能不能做到我要求的东西!
to ugvanxk:你说的是触发器,我早已试过了,但是在delphi下,还是不能获得错误的字段名!
 
我的目的是,再发现有重复的字段报错后,询问用户,是否用新的信息替换旧的字段
如果不知道那个字段重复,就没法确定纪录的内容,就没法更新纪录
不要告诉我检测一下那个字段重复就可以了,因为有可能有很多字段不能重复,这样写太累了!
 
每个先从表中查一次呀,这样不就行了吗

直接从错误码中也不知道是哪个字段的呀
 
如果不用try的话,程序会报错,错误信息里面就有字段名!!
 
会不会你的表结构设计得不好。。。。
 
楼上的老大,这和表的设计没有关系吧!一个表中有多个字段不允许重复,这是合理要求!!
 
比如可不可以把不允许重复的字段整在一张表之类的。。。!然后关联等。。。

不然好像只能麻烦点了,一个一个找了。。

我想不出其他方面。。。不好意思了。。
留给高手解答吧。。。
 
1、将你的Tquery的cachedupdate设置为true;
2、启用database控件的事务处理。
3、在你写入记录到数据表时可以用try ...except...end语句截住。
4、如果你愿意可以让这个操作rollback。
OK
 
SQL Server返回该信息了吗?如果没有,在Delphi程序中怎么可能判断出来呢?
 
SQL server当然返回信息了,但是返回的信息在程序中怎样得到,我现在不知道
如果不用try的话,程序报错,包错的信息就包括重复字段的信息!!
 
接受答案了.
 
后退
顶部