以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [求助]SQL SERVER2000的主键问题  (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=27841)

--  作者:hiliuyong
--  发布时间:2013/1/11 18:08:00
--  [求助]SQL SERVER2000的主键问题

在SQL SERVER2000中,狐表把_Identify设置为主键,可以防止主键重复,

有没有办法,在数据库中禁止列“单号”重复,

狐表的DATATABLE只是限制了加载的重复,如何实现数据库中也防止“单号”重复,请高人指教!

用狐表代码的方式我已经考虑过,如果行数多的话,要逐条判断,效率大受影响。

[此贴子已经被作者于2013-1-11 18:09:15编辑过]

--  作者:lin_hailun
--  发布时间:2013/1/11 18:11:00
--  
 方法一:给这个表设置 唯一约束,这样如果保存了不符合的数据,就会提示报错的。

 方法二:编码控制。

http://www.foxtable.com/help/topics/1994.htm

http://www.foxtable.com/help/topics/2481.htm
[此贴子已经被作者于2013-1-11 18:12:21编辑过]

--  作者:hiliuyong
--  发布时间:2013/1/12 17:07:00
--  

lin

我是通过SQL SERVER设置了唯一约束,

代码如下:

\'保存,并捕获错误代码
Dim x2 As Integer = 0
For Each r3 As DataRow In DataTables("收件").dataRows
    Try
        Tables("收件录入_Table1").Current.Save()
        msgbox(1)
    Catch ex As Exception
        Tables("收件录入_Table1").Position = x2  \'定位出错行
        r3.SetError("运单编号","数据库中已经导入过该运单编号!")
        MessageBox.Show("存在错误,请处理完错误后重新计算!","提示",MessageBoxButtons.OK)
        Return
    End Try
    x2= x2+1
Next

 

但是程序只是在

    Try
        Tables("收件录入_Table1").Current.Save()
        msgbox(1)
这句循环,而且在msgbox(1)前弹出错误,CATCH并未捕获错误,请教了。


--  作者:hiliuyong
--  发布时间:2013/1/12 17:17:00
--  

报错代码如下:

.NET Framework 版本:2.0.50727.3053
Foxtable 版本:2012.11.28.1
错误所在事件:
详细错误信息:
System.Data.OleDb.OleDbException: 语句已终止。
违反了 UNIQUE KEY 约束 \'IX_收件\'。不能在对象 \'收件\' 中插入重复键。
   在 System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   在 System.Data.OleDb.OleDbCommand.ExecuteNonQuery()
   在 System.Data.Common.DbDataAdapter.UpdateRowExecute(RowUpdatedEventArgs rowUpdatedEvent, IDbCommand dataCommand, StatementType cmdIndex)
   在 System.Data.Common.DbDataAdapter.Update(DataRow[] dataRows, DataTableMapping tableMapping)


--  作者:lin_hailun
--  发布时间:2013/1/14 18:12:00
--  
以下是引用hiliuyong在2013-1-12 17:07:00的发言:

lin

我是通过SQL SERVER设置了唯一约束,

代码如下:

\'保存,并捕获错误代码
Dim x2 As Integer = 0
For Each r3 As DataRow In DataTables("收件").dataRows
    Try
        Tables("收件录入_Table1").Current.Save()
        msgbox(1)
    Catch ex As Exception
        Tables("收件录入_Table1").Position = x2  \'定位出错行
        r3.SetError("运单编号","数据库中已经导入过该运单编号!")
        MessageBox.Show("存在错误,请处理完错误后重新计算!","提示",MessageBoxButtons.OK)
        Return
    End Try
    x2= x2+1
Next

 

但是程序只是在

    Try
        Tables("收件录入_Table1").Current.Save()
        msgbox(1)
这句循环,而且在msgbox(1)前弹出错误,CATCH并未捕获错误,请教了。


呵呵,不会抛出异常的,所以无法捕捉!暂时只能使用方法二去控制吧。

--  作者:狐狸爸爸
--  发布时间:2013/1/15 9:21:00
--  

除了小林说的方法,还可以考虑:

 

http://www.foxtable.com/help/topics/0628.htm

 

在这个事件判断断号是否发生变化,如果已经发生变化,就从后台查找是否有同样的单号,如果有,则拒绝保存,这样可以提前捕获绝大多数可能的错误。

 


--  作者:hiliuyong
--  发布时间:2013/1/21 18:53:00
--  

这个是实现从远程数据库判断,而且数据量比较大,用代码判断比较简单,但如果导入数据量大的话,效率会异常低下,

我希望可能捕获唯一约束的那个报错,在导入每一条数据的时候,就减少一次通讯。

狐爸有没有办法可以让我捕获这个错误呢。


--  作者:lin_hailun
--  发布时间:2013/1/22 11:35:00
--  
以下是引用hiliuyong在2013-1-21 18:53:00的发言:

这个是实现从远程数据库判断,而且数据量比较大,用代码判断比较简单,但如果导入数据量大的话,效率会异常低下,

我希望可能捕获唯一约束的那个报错,在导入每一条数据的时候,就减少一次通讯。

狐爸有没有办法可以让我捕获这个错误呢。


没有办法哦,如果要追求效率的话,只能是自己编写存储过程了。

---------------------

 狐表目前不支持事务,只能自己通过代码去完成这件事情了。

 比如,多条插入语句写在一个事务里去,然后检测是否有错误,出错的话,就RollBack

Dim cmd As new SQLCommand
cmd.Co nectio nName = "xxx"
cmd.CommandText = "Begin Transaction test; update 订单 set 单价 = 999; Commit Transaction test"
\'cmd.CommandText = "Begin Transaction test; update 订单 set 单价 = 999; ROLLBACK Transaction test"

cmd.ExecuteNonQuery