Foxtable(狐表)用户栏目专家坐堂 → [求助]使用数据库连接组件update的问题


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

主题:[求助]使用数据库连接组件update的问题

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
[求助]使用数据库连接组件update的问题  发帖心情 Post By:2021/6/4 10:28:00 [只看该作者]

使用了数据库连接组件。(暂时使用access数据库做测试,不直接使用数据表-外部数据源这种方式连接,纯属为了测试数据库连接组件功能,为以后换成mysql做验证)

假设表D的设计中,不使用_Identify做主键,使用自定义的ID(用GUID做主键)
Dim db = HySql.DataBaseFactory.CreateDatabase()
Dim Str = "s t * from 表D"
Dim dt As System.Data.DataTable = db.ExecuteDataSet(Str).Tables(0)
'可以形成查询表dt
'


'然后把dt的数据复制到客户端的表D中
Dim cs As String() = {"_SortKey","ID","第一列","第二列","第三列","第四列"}
DataTables("表D").DataRows.Clear
DataTables("表D").StopRedraw

For Each r As system.data.DataRow In dt.Rows
    Dim dr As DataRow = DataTables("表D").AddNew
    For i As Integer = 0 To cs.Length - 1
        dr(cs(i)) = r(cs(i))
    Next
Next
DataTables("表D").ResumeRedraw



[此贴子已经被作者于2021/6/4 10:28:41编辑过]

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/6/4 10:30:00 [只看该作者]


''以上都可以正常执行
'''下面这一段就报错了
Dim res = db.Up*dateDataTable(DataTables("表D").BaseTable)
OUTPUT.SHOW(res)

错误信息如下:
System.Data    .OleDb     .OleDbException (0x80004005): 由于将在索引、 主关键字、或关系中创建重复的值,请求对表的改变没有成功。 改变该字段中的或包含重复数据的字段中的数据,删除索引或重新定义索引以允许重复的值并再试一次

这是什么问题呢?
如果用_Identify做主键,就不会报错,但每执行一次最后一段代码,就会把客户端的表D数据复制一次,显然这是有问题的。
如果用自定义的GUID做主键,又报这个错误,怎么整?

[此贴子已经被作者于2021/6/4 10:30:29编辑过]

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/4 11:10:00 [只看该作者]

提示就是主键值重复了,ID列是不是自增的?

DataTables("表D")是内部表还是外部表?

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/6/4 11:45:00 [只看该作者]

ID列是主键,是UUID,不可能重复的,但_Identify是自增的(但它不是主键)

因为是用的第三方连接组件HySql.dll,不是直接连的。

DataTables("表D")是内部表,但它的数据来源于外部表的表D,表名一样。是不是说把外部表的数据复制到本地以后,要把数据更新到服务器,还只能用SQL执行?
[此贴子已经被作者于2021/6/4 11:46:12编辑过]

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/4 12:05:00 [只看该作者]

不是重复,就是保存了2个以上的空行,没有其它可能

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/6/4 12:17:00 [只看该作者]

目前的代码是这样的,麻烦帮忙检查一下吧。
 下载信息  [文件大小:   下载次数: ]
图片点击可在新窗口打开查看点击浏览该文件:csmysql.zip


将数据加载到本地以后,执行最后一句,也会报错

空行倒是可以避免,但ID重复,这个也不行?数据加载到本地,然后修改一些数据(但ID没有变化),这样都不能保存?
[此贴子已经被作者于2021/6/4 12:31:55编辑过]

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/4 12:39:00 [只看该作者]

大概知道是什么原因了,DataTables("表D").BaseTable取到的表格主键是_Identify,表结构和数据库里的表是不一样的,虽然表名都是【表D】,db.UpdateDataTable会全部按新增处理

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/6/4 15:06:00 [只看该作者]

咋解决呢?

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


加好友 发短信
等级:超级版主 帖子:110648 积分:563148 威望:0 精华:9 注册:2015/6/24 9:21:00
  发帖心情 Post By:2021/6/4 15:26:00 [只看该作者]

1、直接绑定窗口表使用,保证表结构一致
2、逐条写SQL更新。

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


加好友 发短信
等级:九尾狐 帖子:2240 积分:18457 威望:0 精华:0 注册:2011/11/26 20:21:00
  发帖心情 Post By:2021/6/5 4:00:00 [只看该作者]

1.把mdb中的表设计改为_identify做主键,每执行一次最后一句,就会复制一次界面表数据到数据库,与初衷不同;2、是否能实现让basetable去读取设定的id而不是_identify作主键? 逐条更新是不是效率太低了?如果想用窗口表我就不费这么大劲了
[此贴子已经被作者于2021/6/5 4:03:05编辑过]

 回到顶部
总数 13 1 2 下一页