以文本方式查看主题 - Foxtable(狐表) (http://foxtable.com/bbs/index.asp) -- 专家坐堂 (http://foxtable.com/bbs/list.asp?boardid=2) ---- [求助]使用数据库连接组件update的问题 (http://foxtable.com/bbs/dispbbs.asp?boardid=2&id=169141) |
||||
-- 作者:chnfo -- 发布时间:2021/6/4 10:28:00 -- [求助]使用数据库连接组件update的问题 使用了数据库连接组件。(暂时使用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 -- 发布时间: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编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2021/6/4 11:10:00 -- 提示就是主键值重复了,ID列是不是自增的? |
||||
-- 作者:chnfo -- 发布时间:2021/6/4 11:45:00 -- ID列是主键,是UUID,不可能重复的,但_Identify是自增的(但它不是主键) 因为是用的第三方连接组件HySql.dll,不是直接连的。 DataTables("表D")是内部表,但它的数据来源于外部表的表D,表名一样。是不是说把外部表的数据复制到本地以后,要把数据更新到服务器,还只能用SQL执行?
[此贴子已经被作者于2021/6/4 11:46:12编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2021/6/4 12:05:00 -- 不是重复,就是保存了2个以上的空行,没有其它可能 |
||||
-- 作者:chnfo -- 发布时间:2021/6/4 12:17:00 -- 目前的代码是这样的,麻烦帮忙检查一下吧。
将数据加载到本地以后,执行最后一句,也会报错 空行倒是可以避免,但ID重复,这个也不行?数据加载到本地,然后修改一些数据(但ID没有变化),这样都不能保存?
[此贴子已经被作者于2021/6/4 12:31:55编辑过]
|
||||
-- 作者:有点蓝 -- 发布时间:2021/6/4 12:39:00 -- 大概知道是什么原因了,DataTables("表D").BaseTable取到的表格主键是_Identify,表结构和数据库里的表是不一样的,虽然表名都是【表D】,db.UpdateDataTable会全部按新增处理 |
||||
-- 作者:chnfo -- 发布时间:2021/6/4 15:06:00 -- 咋解决呢? |
||||
-- 作者:有点蓝 -- 发布时间:2021/6/4 15:26:00 -- 1、直接绑定窗口表使用,保证表结构一致 2、逐条写SQL更新。
|
||||
-- 作者:chnfo -- 发布时间:2021/6/5 4:00:00 -- 1.把mdb中的表设计改为_identify做主键,每执行一次最后一句,就会复制一次界面表数据到数据库,与初衷不同;2、是否能实现让basetable去读取设定的id而不是_identify作主键? 逐条更新是不是效率太低了?如果想用窗口表我就不费这么大劲了 [此贴子已经被作者于2021/6/5 4:03:05编辑过]
|