水如烟:能将MS SQL数据导出成xml文件,但不知道如何快捷导入到SQLServer的表里。

沐NeMo 2008-04-26 10:28:33
导出的xml文件,是从一个表导出用户选择的一些记录。如何快捷的导入到另外一个表里面,表的结构相同?难道要去分析xml文件的数据。每

个记录每个记录的去处理。进行导入到SQL Server得表里面吗。同时判断要注意记录是否已经存在。有就跳过,不更新记录。
下面就是用最笨的方法导入数据:
dt = New DataTable
dt.ReadXml(xmlFpath)
If dt.Rows.Count > 0 Then
QsCls = New QSClass
'选择的导入记录的方法:如果记录存在,跳过或强制删除两种方法。
If ImportMeths = ImportMethod.JumpNoUpdate Then
For i = 0 To dt.Rows.Count - 1
TmpItemNo = ""
TmpItemNo = dt.Rows(i)(0).ToString
If QsCls.CheckQSItemNoExist(TmpItemNo) = False Then
'导入数据,不想一行一行的导入。因为要表有40个字段。而且插入记录时候浪费资源和时间。
'有什么好方法啊?水版主。
End If
Next
End If
If ImportMeths = ImportMethod.DelAndUpdate Then
For i = 0 To dt.Rows.Count - 1
TmpItemNo = ""
TmpItemNo = dt.Rows(i)(0).ToString
If QsCls.CheckQSItemNoExist(TmpItemNo) Then
QsCls.Delete(TmpItemNo) '如果记录存在删除记录,然后插入新记录。
End If
'导入数据,也说是插入新记录吧。
Next
End If
QsCls = Nothing
End If
...全文
194 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
沐NeMo 2008-05-02
  • 打赏
  • 举报
回复
版主考虑的这么样了啊。问题还没解决呢。
我只能用我原来的方法做呢。
水如烟 2008-04-28
  • 打赏
  • 举报
回复
你的问题我现在也在考虑.你先试.
我的实现这个:

    Private dbsql As Global.LzmTW.Data.DatabaseHelper = New Global.LzmTW.Data.SqlSqlClientDatabase(".", "Northwind")
Private dbexcel As Global.LzmTW.Data.DatabaseHelper = New Global.LzmTW.Data.ExcelOdbcDatabase("g:\office\new.xls")

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
Dim tablename As String = "Customers"

Dim table As DataTable = dbsql.GetDataTable(tablename)

Dim result As Boolean = dbexcel.ImportTable(tablename, table, New String() {"CustomerID"})

Console.WriteLine(result)

Me.DataGridView1.DataSource = dbexcel.GetDataTable(tablename)
End Sub
沐NeMo 2008-04-28
  • 打赏
  • 举报
回复
那么还有,这么控制更新在新表和旧表中有相同主键的记录呢?我希望是可以由用户来决定:1、删除并替换,2、跳过不更新。
是否就是MSDN说的:
instance.Merge(table, preserveChanges)
通常在一系列过程的末尾调用 Merge 方法,这些过程涉及验证更改、消除错误、使用更改更新数据源并最后刷新现有的 DataTable。
除非开发人员将 preserveChanges 参数指定为 false,否则在执行合并时,合并操作中将保留合并前对现有数据所做的更改。如果 preserveChanges 参数设置为 true,则传入值不改写现有行的 Current 行版本中的现有值。如果 preserveChanges 参数设置为 false,则传入值将改写现有行的 Current 行版本中的现有值。(这个说明,我不大理解)

1、删除并替换,就把参数 preserveChanges设为false
2、跳过不更新。参数preserveChanges=true呢。
主要针对有相同主键的记录更新问题。???
谢谢了。
沐NeMo 2008-04-28
  • 打赏
  • 举报
回复
太谢谢你了。你的大公无私,感动着我。不愧是版主。
我会努力的。我在vba板块也要常帮助人(虽然现在只有一颗红星,呵呵)。
“gogo 加油。”【浪漫满屋】里面的台词。
水如烟 2008-04-27
  • 打赏
  • 举报
回复
这句:
newTable.Load(table.CreateDataReader, LoadOption.Upsert)
水如烟 2008-04-27
  • 打赏
  • 举报
回复
        '新增数据到一个新表,目的是使行的Rowstate为Add以便DbDataAdapter进行Update
Dim newTable As DataTable = table.Clone
newTable.Load(table.CreateDataReader, LoadOption.Upsert)

'指定OrderID为主键进行更新
db.Update("Orders", newTable, New String() {"OrderID"})
沐NeMo 2008-04-27
  • 打赏
  • 举报
回复
通过merge合并两个架构相同的表。
merge过来的数据是从一个xml文件读来的。所以他的RowStatue的状态没有是unchanged.
而且我需要的是用户决定更改所有数据就更改替换掉旧表中的数据。如果用户选择跳过相同主键的,就不更改原来相同主键记录的数据只插入原来没有而新表有是记录。
???
水如烟 2008-04-26
  • 打赏
  • 举报
回复
如果两个表的结构相同

针对数据库的表建好
Dim ad As SqlDataAdapter = New ...

Dim table As New DataTable

ad.Fill(table)

dim xmlTable As New DataTable
xmlTable.ReadXml

table.Merge(xmlTable,参数)

ad.Update(table)就可以了

至于merge后头的参数选择,你自己试一下,注意的是保证merge过来的数据在dataTable中的RowStatue状态为Add就可以了.

Access 通用系统1.0 使用说明文档 作者:红尘如烟 下载后请按住shift键不放,在双击打开数据库文件,打开了后在放shift键,可以看设计状态源代码.. 后台数据库密码:admin 前台用户名:admin 密码:admin 仅作为同所有access爱好者参考学习与讨论共同进步用。 此源码软件为2007格式,您需要安装2007或者2010版本的access才能使用,如果您没有安装2007或者2010软件请见下面链接下载安装。 说明: 1、修复了红尘如烟老师的通用系统1.1版本中的数据备份与还原在access2007中无法使用的情况。 2、主界面进行了修改,添加了重新登录和退出按钮。 3、修复了通用系统中的权限中的部分小问题;另增加了一个窗体控件权限的管理和分配。 4、该小系统是一个大杂烩,很多功能都是从许多高手和大师哪里给借鉴来的,thanks。 功能介绍: 1、工资录入以及录入之后修改,可进行自动计算实际应发工资;在录入修改中,修改其中几种,可实现动态更新应发合计;工龄工资、应纳税、个人社会保险等自动计算。 2、人事变动的过程记录,同时可根据变动的类型,更新人事档案中的工资级别,转正日期,职位等信息。 3、人事档案中的头像照片,保存在文件夹中,减少data数据库的存储空间。 4、导入导出,备份还原,权限分组控制,窗体中某些功能限制等 5、组合查询,且可导出查询的任意结果,以及打印任意查询结果;报表也可以一个月单据进行批量打印。 本程序集了Access程序开发中的一些常用功能模块,适合于有一定基础的初学者或者想减少开发时间的人,可以让你省去开发这些功能的时间。目前是最初版本,只能算是一个大体上的粗坏,而且没有经过详细测试,我只不过是换了几台电脑运行使用了一下而已。不过我开发的时候完全是使用Access本身的功能实现的,没有使用任何的第三方控件,甚至连多余的引用都没有,只要你用的是Access 2003简体中文版本就应该没有太大问题,而且我测试的时候还使用过中文操作系统、英文Access的环境,运行也没有出现问题。 本程序完全免费,而且开放源码,你可以随意使用和修改,就当是免费而且没有食品安全问题的午餐了。大家在使用的时候能给我保留一些版权信息我就很满意了,不过你要是将程序里面的版权信息完全删除我也没有办法,总不至于找你真人PK吧?哈哈,开个玩笑。 如何将本程序集到你做的系统: 本程序使用的是前后台的模式,所以需要两个mdb文件,一个做为前台,一个做为后台。 第一步,将本程序和你做的系统合并:将两者的表导入合并到同一个mdb文件,其它对象导入合并到另一个mdb文件。(注:本程序用到的表的表名使用了特殊前缀USys,默认情况下Access会当做系统对象隐藏,要显示并查看请打开任意一个mdb文件,然后点击菜单-工具-选项-视图-显示系统对象。) 第二步,修改链接表定义:本程序使用的链接方法不是刷新链接表,而是在启动时自动创建链接表,在退出时链接表会被删除,所以需要定义链接表。本程序中的链接表定义是写在代码中的,请打开模块modLinkData,然后找到第二个函数LinkData,在如下图所示的地方进行修改: 一共需要修改3处地方,一是表数量,二是要链接的源表名称,这些表名保存在数组变量gstrSourceTableName中,其中1-8为本程序用到的表,建议不要修改,从9开始添加你设计的表,下面的数组变量gstrLinkTableName为要创建的链接表的名称,这个为可选,如果需要创建链接表不和实际上的源表名称相同时才用到。 需要注意的问题:源表名数组变量标号必须从1开始且为连续的,且必须保证源表名的正确,只要有任意一个链接表不能被创建,都将被视为无法正确连接后台数据库,从而不能登录。 此处的后台数据库文件可以为任意名称,扩展名也可以任意修改,登录时如果和设定的后台数据库不一致,系统会自动查找前台所在的目录,只要能够找到上面定义的所有源表,就可以自动将此文件设为后台数据库(此处会提示确认,主要是防止出现多个一样的文件,比如将备份文件放在了该文件夹)。 第三步,修改相关设置。进行了以上两步操作就可以正常登录了,这一步要做的就是以初始用户身份登录,打开系统设置,对一些需要修改的地方进行设置,如应用程序名称等,修改完毕后点击确定保存。再打开菜单及面板管理,通过菜单编辑器把你做的内容加入到菜单中。 通过以上简单的几步,我们就可以正常使用集后的系统了。 其它功能上的说明我考虑加入到程序中,而不是使用单独的文档说明。也不知道为什么,我就是不喜欢应用软件中一大堆乱七八糟的文件,可能这正是我喜欢Access的重要原因:有时候一个文件就能实现全部功能,实在是看着舒坦啊。 另外可以在程序文件夹中放置相应名称的图片即可替

16,554

社区成员

发帖
与我相关
我的任务
社区描述
VB技术相关讨论,主要为经典vb,即VB6.0
社区管理员
  • VB.NET
  • 水哥阿乐
  • 无·法
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧