关于写入数据库异常的问题....(200分)

  • 主题发起人 主题发起人 dfoversky
  • 开始时间 开始时间
D

dfoversky

Unregistered / Unconfirmed
GUEST, unregistred user!
循环往一个表写入数据(sqlserver数据库),用程序侦测的时候,不想出现写入失败的提示(主键重复提示)。出现其它异常的时候出提示,程序该怎么写呢?delphi6里有相应的设置吗?<br>目前程序是这样的:<br>try<br>&nbsp; &lt;写入数据库&gt;<br>except<br>&nbsp; continue;<br>end;
 
不知道你要的是什么意思,<br>你这个主键冲突了 肯定是插入失败的<br>难道你要出错不告诉用户出错了?<br>再说主键冲突问题 完全是程序本身问题
 
if 当前插入的值在数据库中不存在 then<br>&nbsp; &nbsp; &lt;写入数据库&gt;<br>&nbsp; else<br>&nbsp; &nbsp; &nbsp;ShowMessage('数据库中已经存在这个值');
 
不同的数据库错误有不同的错误号,可以在Adoconnection.errors集合中取到<br>记住主键冲突的错误号,排除它就可以了
 
to onyliu:因为有大量的数据要导入,用程序侦测的时候,一条记录如果主键重复了,就写入数据库失败了,但是这是属于正常的异常,属于重复导入数据。但是用程序侦测可就麻烦了,写入一条出个提示对话框,我现在就是想怎么能设置一下,不出这种异常的错误提示。
 
to 轻舞肥羊 你好:<br>有具体的例子吗?我从来没写过这样的程序,谢谢。<br>怎么能查到主键冲突的错误号,怎么才能排除呢?
 
用以下代码测试,其中acm为adocommand,acn为adoconnection,mem为TMemo<br>var<br>&nbsp; i : Integer;<br>begin<br>&nbsp; acm.CommandText := &nbsp;'set IDENTITY_INSERT tx on; insert into tx (id, dt, ip, bw) values (1000000, ''2000-1-1'', '''', '''')';<br>&nbsp; try<br>&nbsp; &nbsp; acm.execute;<br>&nbsp; except<br>&nbsp; &nbsp; for i := &nbsp;0 to acn.Errors.Count - 1 do<br>&nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; mem.Lines.Add(acn.Errors.SQLState);<br>&nbsp; &nbsp; &nbsp; mem.Lines.Add(acn.Errors.Source);<br>&nbsp; &nbsp; &nbsp; mem.Lines.Add(acn.Errors.Description);<br>&nbsp; &nbsp; end;<br>&nbsp; end;<br>end;<br>如果ID为主键并插入重复值,memo中会有这样的字样:<br>23000<br>Microsoft OLE DB Provider for SQL Server<br>违反了 PRIMARY KEY 约束 'PK_tx'。不能在对象 'dbo.tx' 中插入重复键。<br>01000<br>Microsoft OLE DB Provider for SQL Server<br>语句已终止。<br><br>记住主键冲突的代码23000,你要做的是:如果errors集合中存在这个代码则跳过这个错误,否则raise抛出来
 
如果errors集合中存在这个代码则跳过这个错误,否则raise抛出来:<br>这样写吗?<br>try<br>写入数据库;<br>excpet<br>&nbsp; &nbsp; &nbsp; &nbsp;if acn.Errors[acn.Errors.Count - 2].SQLState = '23000' then<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; acn.RollbackTrans()<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; else<br>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; raise;<br>end;
 
代码里写好像不行啊。
 
在插入目标表里建一个主键字段且自动递增,源表中的主键字段不去管它,等全部插完后,再来处理
 
try<br>&nbsp; &nbsp; ...<br>&nbsp; except<br>&nbsp; &nbsp; for i := &nbsp;0 to acn.Errors.Count - 1 do<br>&nbsp; &nbsp; &nbsp; if acn.Errors.SQLState = '23000' then<br>&nbsp; &nbsp; &nbsp; begin<br>&nbsp; &nbsp; &nbsp; &nbsp; exit;//把插入数据的过程写成一个procedure<br>&nbsp; &nbsp; &nbsp; &nbsp; break;<br>&nbsp; &nbsp; &nbsp; end;<br>&nbsp; &nbsp; raise Exception.Create(acn.Errors[0].Description);<br>&nbsp; end;
 
还是不行的,主键一重复就出那个 对话框,只能在delphi里<br>Tools-&gt;Debugger-&gt;Language Exceptions 里添加不提示的异常类:<br>EOleException 和 EDataBaseError <br>这样虽然不出:违反了 PRIMARY KEY 约束 的对话框了,但是如果过程里有别的SQL语句错误或数据库操作错误。就侦测不出来了。 -_-!!
 
结帖。。。。
 
多人接受答案了。
 

Similar threads

S
回复
0
查看
3K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
751
SUNSTONE的Delphi笔记
S
后退
顶部