我给你外部数据源的,我修改过
'非开发者才需要检测表升级
If User.Type <> UserTypeEnum.Developer Then
If FileSys.FileExists(ProjectPath & "\Attachments\addtable.txt") = True '判断addtable.txt文件是否存在
Dim s As String = FileSys.ReadAllText(ProjectPath & "\Attachments\addtable.txt",Encoding.Default) '读取该文本文件的内容
s = s.Replace(chr(10),"").Replace(chr(13),";").Replace(chr(-23636),",") '支持英文分号和回车分隔多表,支持中英文逗号分割字符列属性和指定长度,以避免手误
Dim Values(),Value1s(),Value2s() As String '定义字符型数组用于存储多表分割字符串?表名称?列名称和列属性
Values = s.split(";") '分割多行内容,将分割的内容添加到数组
'-----------------------------------------------以下代码创建表
For Index As Integer = 0 To Values.Length - 1 '循环遍历数组
Value1s = Values(Index).split("/") '提取表名称到数组
Dim Builder As New ADOXBuilder("DB") '定义一个新的ADOXBuilder
Dim tbl As ADOXTable '定义一个新的ADOXTable
If DataTables.Contains(Value1s(0)) = False '如果已经加载的datatable中不存在已经提取到的表
Dim lst As List(Of String) '定义一个字符型集合
lst = Connections("DB").GetTableNames '将远程数据库的所有表名称返回到字符串集合【注数据库名称需要根据您的项目自己修改】
If lst.Contains(Value1s(0))= False Then '如果后台数据库也不存在已经提取到的表
Builder.Open() '打开ADOXBuilder
tbl = Builder.NewTable(Value1s(0)) '以提取到的表名称创建一个新表
Builder.AddTable(tbl,True,True) '将刚刚创建的表添加到远程数据源中
Builder.Close() '关闭ADOXBuilder
End If
DataTables.Load(Value1s(0)) '动态加载刚刚直接在数据源中已经新添的表
End If '到此,从文本文件提取的表肯定已经存在并动态加载了该datatable
'-----------------------------------------------以下代码创建列
Builder = New ADOXBuilder("DB") '生成一个新的ADOXBuilder
Builder.Open() '打开ADOXBuilder
Value2s = Value1s(1).split("|") '分割各列名称和列属性标识的符串,并添加到数组
With Builder.Tables(Value1s(0))
For i As Integer = 0 To Value2s.Length - 1 '循环遍历数组(所需增加的各列)
If DataTables(Value1s(0)).DataCols.Contains(Value2s(i).split("(")(0)) = False '如果从文本文件提出到的表中不存在刚刚从文本文件中提取到的列
If Value2s(i).split("(")(1).split(")")(0) Like "String*" '判断提取到的列属性标识包含以String为首的字符串,则肯定该列为字符串
Dim n As Integer = Value2s(i).split("(")(1).split(")")(0).split(",")(1) '提取字符型列所需指定的字符长度
.AddColumn(Value2s(i).split("(")(0),ADOXType.String,n) '添加为字符型列并指定字符长度
Else '该列如果属性标识不是字符串列
output.show(1)
If Value2s(i).split("(")(1).split(")")(0) = "DateTime" '如果提取到的列属性标识为DateTime,则肯定该列为日期时间型
.AddColumn(Value2s(i).split("(")(0),ADOXType.DateTime) '添加为日期时间型列
End If
output.show(1)
If Value2s(i).split("(")(1).split(")")(0) = "Byte" '如果提取到的列属性标识为Byte,则肯定该列为微整数型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Byte) '添加为微整数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Short" '如果提取到的列属性标识为Short,则肯定该列为短整型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Short) '添加为短整数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Integer" '如果提取到的列属性标识为Integer,则肯定该列为整数型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Integer) '添加为整数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Single" '如果提取到的列属性标识为Single,则肯定该列为单精度小数型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Single) '添加为单精度小数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Double" '如果提取到的列属性标识为Double,则肯定该列为双精度小数型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Double) '添加为双精度小数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Decimal" '如果提取到的列属性标识为Decimal,则肯定该列为高精度小数型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Decimal) '添加为高精度小数型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "备注" '如果提取到的列属性标识为备注,则肯定该列为备注型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Text) '添加为备注型列
End If
If Value2s(i).split("(")(1).split(")")(0) = "Boolean" '如果提取到的列属性标识为Boolean,则肯定该列为逻辑型
.AddColumn(Value2s(i).split("(")(0),ADOXType.Boolean) '添加为逻辑型列
End If
End If
End If
Next
End With
Builder.Close() '关闭ADOXBuilder
DataTables(Value1s(0)).Fill("sel去掉我ect * From {" & Value1s(0) & "}","DB",False) '重新执行提取到的表的fill方法
Next
FileSys.DeleteFile(ProjectPath & "\Attachments\addtable.txt",2,2) '彻底删除这个addtable.txt文本文件,下次启动系统找不到这个文件,再无需增加列.
End If
End If
[此贴子已经被作者于2020/3/4 11:30:05编辑过]