以文本方式查看主题

-  Foxtable(狐表)  (http://foxtable.com/bbs/index.asp)
--  专家坐堂  (http://foxtable.com/bbs/list.asp?boardid=2)
----  [分享]动态更新表结构,有错误,修改中...请帮忙  (http://foxtable.com/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的方式搞定。调用这种组件很难控制和调试