Foxtable(狐表)用户栏目专家坐堂 → [求助]SQL SERVER2000的主键问题


  共有9159人关注过本帖树形打印复制链接

主题:[求助]SQL SERVER2000的主键问题

帅哥哟,离线,有人找我吗?
hiliuyong
  1楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:436 积分:5082 威望:0 精华:0 注册:2012/3/27 15:33:00
[求助]SQL SERVER2000的主键问题  发帖心情 Post By:2013/1/11 18:08:00 [只看该作者]

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

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

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

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

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

 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  2楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By: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
  3楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:436 积分:5082 威望:0 精华:0 注册:2012/3/27 15:33:00
  发帖心情 Post By: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
  4楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:436 积分:5082 威望:0 精华:0 注册:2012/3/27 15:33:00
  发帖心情 Post By: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
  5楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By: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并未捕获错误,请教了。


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

 回到顶部
帅哥哟,离线,有人找我吗?
狐狸爸爸
  6楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:管理员 帖子:47497 积分:251403 威望:0 精华:91 注册:2008/6/17 17:14:00
  发帖心情 Post By:2013/1/15 9:21:00 [只看该作者]

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

 

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

 

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

 


 回到顶部
帅哥哟,离线,有人找我吗?
hiliuyong
  7楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:一尾狐 帖子:436 积分:5082 威望:0 精华:0 注册:2012/3/27 15:33:00
  发帖心情 Post By:2013/1/21 18:53:00 [只看该作者]

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

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

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


 回到顶部
帅哥哟,离线,有人找我吗?
lin_hailun
  8楼 | 信息 | 搜索 | 邮箱 | 主页 | UC


加好友 发短信
等级:狐神 帖子:6708 积分:34304 威望:0 精华:11 注册:2012/8/18 23:10:00
  发帖心情 Post By: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

 回到顶部