以文本方式查看主题 - Foxtable(狐表) (http://foxtable.net/bbs/index.asp) -- 专家坐堂 (http://foxtable.net/bbs/list.asp?boardid=2) ---- [分享]动态更新表结构,有错误,修改中...请帮忙 (http://foxtable.net/bbs/dispbbs.asp?boardid=2&id=137785) |
-- 作者:淡月斜阳 -- 发布时间:2019/7/15 17:40:00 -- [分享]动态更新表结构,有错误,修改中...请帮忙 发布给客户的程序,经常需要修改表结构,试着写了以下代码。 以下内容为程序代码: 1 Dim constr As String="Provider=Microsoft.ACE.OLEDB.12.0;User ID=admin;Data Source=D:\\data.accdb;Persist Security Info=False" \'标准数据库 2 Dim constr1 As String ="Provider=Microsoft.ACE.OLEDB.12.0;User ID=admin;Data Source=D:\\da.accdb;Persist Security Info=False" \'目标数据库 3 Dim rdb As new adodb.Connection \'标准 4 Dim rdb1 As new adodb.Connection \'目标 5 Dim cat As new Adox.CataLog \'标准 6 Dim cat1 As new Adox.CataLog \'目标 7 rdb.open(constr ) \'打开标准数据库 8 rdb1.open(constr1 ) \' 打开目录数据库 9 cat.ActiveConnection =rdb 10 cat1.ActiveConnection =rdb1 11 \'\'同步表 12 try 13 output.Show("同步表,个数" & Cat.Tables.Count ) 14 For i As Integer = 0 To Cat.Tables.Count - 1 15 If Cat.Tables(i).Type = "Table" Then 16 Dim TName As String 17 Dim TbBz As New Adox.Table 18 TbBz =Cat.Tables(i) 19 TName = TbBz.Name 20 \'检查目标数据库中是否存在此Table 21 Dim TExits As Integer = 0 \'表存在标记 22 For j As Integer = 0 To Cat1.Tables.Count-1 \'检查是否存在表 23 If Cat1.Tables(j).Name = TName Then 24 TExits =1 25 Exit For 26 End If 27 Next 28 If TExits = 0 Then \'创建表 29 Dim Tb1 As New Adox.Table 30 tb1.Name = Tname 31 Cat1.Tables.Append(Tb1) 32 End If 33 Dim TbMb As Adox.Table 34 TbMb = cat1.Tables(TName) \'目标表 35 Output.Show("同步表:" & TbBz.Name & " 列数:" & TbBz.Columns.count ) 36 For k As Integer = 0 To TbBz.Columns.count - 1 \'遍历列 37 Dim CBz As Adox.Column 38 CBz = cat.Tables(i).Columns(k) \'标准列 39 Dim kexits As Integer = 0 40 Output.Show("检查此列:" & TName & CBz.Name & "-" & Cbz.Type & "-" & Cbz.DefinedSize) 41 For m As Integer = 0 To TbMb.Columns.count -1 \'查找是否存在此列 42 If TbMb.Columns(m).Name = CBz.Name Then 43 kexits =1 44 Exit For 45 End If 46 Next m 47 If kexits = 1 Then \'存在此列 48 Continue For 49 Else \'不存在此列 50 output.Show("创建列-" & "表名称:" & TName & "-列名称:" & Cbz.Name & "-列类型:" & Cbz.Type) 51 If Cbz.Type=202 Or Cbz.Type=200 Then 52 TbMb.Columns.Append(CBz.Name,Cbz.Type,Cbz.DefinedSize) 53 ElseIf Cbz.Type=131 Then 54 Dim Col1 As New ADOX.Column 55 col1.Name = CBz.Name 56 col1.Type = CBz.Type 57 col1.NumericScale = CBz.NumericScale 58 col1.Precision = CBz.Precision 59 TbMb.Columns.Append(col1) 60 Else 61 TbMb.Columns.Append(CBz.Name,Cbz.Type) 62 End If 63 End If 64 Next k 65 66 End If 67 Next 68 69 \'=================== 70 \'同步视图 71 72 73 74 \'清除 目标数据库的 VIEW 集合 75 output.Show("删除View,view个数" & CAT1.Views.Count ) 76 For i As Integer = 0 To CAT1.Tables.Count - 1 77 If Cat1.Tables(i).Type = "View" Then 78 Output.Show("View-delete-" & Cat1.Tables(i).Name) 79 cat1.Views.Delete(Cat1.Tables(i).Name) 80 \'Cat1.Views.delete( Cat1.Views(i)) 81 Output.Show("View-deleted") 82 End If 83 84 Next i 85 \'重新向目标数据库中添加VIEW. 86 For i As Integer = 0 To Cat.Views.Count -1 87 Output.Show("View_adding" & Cat.VIews(i).Name) 88 Dim vName As String = Cat.VIews(i).Name 89 Dim cmd As New ADODB.Command 90 cmd=Cat.views(i).Command 91 Dim cmd1 As new ADODB.Command 92 cmd1.CommandText = cmd.CommandText \'目标 = 标准 93 cat1.Views.Append(vName,cmd1) 94 Next 95 \' 96 \'删除过程 97 output.Show("Pro_Delete,个数" & CAT1.Procedures.Count ) 98 For i As Integer = 0 To CAT1.Procedures.Count - 1 99 Output.Show("Procedures-delete-" & Cat1.Procedures(i).Name) 100 cat1.Procedures.Delete(Cat1.Procedures(i).Name) 101 Output.Show("Procedures-deleted") 102 Next i 103 \'重建过程 104 For i As Integer = 0 To Cat.Procedures.Count -1 105 Output.Show("Procedures_adding" & Cat.Procedures(i).Name) 106 Dim vName As String = Cat.Procedures(i).Name 107 Dim cmd As New ADODB.Command 108 cmd=Cat.Procedures(i).Command 109 Dim cmd1 As new ADODB.Command 110 cmd1.CommandText = cmd.CommandText \'目标 = 标准 111 cat1.Procedures.Append(vName,cmd1) 112 Next 113 \'Clear UP 114 cat= Nothing 115 cat1= Nothing 116 rdb.close 117 rdb1.close 118 output.Show("执行成功!") 119 Catch ex As Exception 120 cat= Nothing 121 cat1= Nothing 122 rdb.close 123 rdb1.close 124 End Try 125 目前有以下问题: 1.用于ACCESS数据库,测试通过,但是,需要运行几次才能成功。错误发生在:cat1.Views.Delete 和 cat1.Procedures.Delete 。运行两三次,也能成功。不知道原因在哪。 2.ACCESS数据库,不能有密码,有密码报错,不知道原因。 2.用于sql数据库,以上代码需要修改。sql不允许append没有字段的表,需要修改一下,新建表时,把字段也加上。 未完成: 主键 索引 等设定。 请各位狐友帮忙修正。
[此贴子已经被作者于2019/7/15 17:40:48编辑过]
|
-- 作者:nxhylczh -- 发布时间:2019/7/15 18:01:00 -- shafa |
-- 作者:禾成 -- 发布时间:2019/7/15 18:23:00 -- 我也正有这样的困惑,给用户的程序有更改或增加删除列的需要,很麻烦! |
-- 作者:百灵 -- 发布时间:2019/7/15 21:32:00 -- 不用那么麻烦吧,直接新增列删除列不就行了。http://www.foxtable.com/bbs/dispbbs.asp?boardid=2&Id=95345&page=2 |
-- 作者:淡月斜阳 -- 发布时间:2019/7/15 21:39:00 -- 不是只有列,还有表 视图 过程 |
-- 作者:百灵 -- 发布时间:2019/7/15 21:50:00 -- 过程不懂。重命名表,删除表,更新视图,都是可以用SQL语句修改的呀 |
-- 作者:百灵 -- 发布时间:2019/7/15 21:52:00 -- 删除表,复制表也可以,不知道你这个要达到什么目的 |
-- 作者:有点蓝 -- 发布时间:2019/7/15 22:47:00 -- 数据库基本所有操作都以通过执行sql的方式搞定。调用这种组件很难控制和调试 |