假设一个常见的场景先吧----实际也是我当前的场景-----把一个excel 文件导入到数据库. 这实在是一个常见的功能,但是,没想到的是, 我着实费了一把劲.

实际上,我以前写的有现成的函数来完成这个工作, 但是, 可惜那函数只能在VS2005 下工作, 在2003下面无效,无效的原因是,vs2003 的DataTable.Rows[i].SetAdded() 方法不存在. 也就是说, 你没有办法去更改一行的RowState, 而从excel 读到的dataTable的 行状态"默认" 是unChanged.

如果不信, 你也可以尝试去google或百度上搜一下试试看, 关于这个功能的贴子真是少得可怜,大约大家都换用vs2005了吧, 我找了半天, 零零碎碎地找到一些信息, 这些信息都指向DataTable.GetChanges(RowState) 函数, 由于都是语焉不详, 所以我高兴地认为, 这个函数能将表的所有行的状态都设置为参数所指定的RowState, 就像我原来的函数用一个for循环为每一行调用SetAdded 的效果一样, 我一边还惭愧, 以前用了那么笨的办法. 然而心底却在奇怪, 微软怎么会起了这么笨的一个函数名.

一番测试后, 终于弄明白原来不是微软笨,而是我弄错了, GetChanges函数果然是用来Get, 而不是set的, 它返回母表中指定状态的行组成的子表, 也就是说, 刚才的查找白费了.

再找了一会儿, 借助于Mitch Milam 先生十分专业的一篇文章, 终于找到了正确的solution, 这篇文章的url:
http://blogs.infinite-x.net/2006/09/21/the-saga-of-net-dataadapterupdate-and-multiple-tables/print/
说它专业, 是因为这篇文章几乎是以正规科技论文的格式来写的, 虽然我自己写论文的时候很讨厌麻烦的格式, 但是阅读的时候, 却不得不承认, 这种严谨的格式读起来实在是愉快地多. ----废话少说, 问题的关键在于行状态, 从excel 读取后成了unchanged, 而且又无法修改, 问题就在于读取. 原来数据适配器有一个AcceptChangesDuringFill 属性, 这个属性默认为true, 所以调用Fill 方法后, 它就自动地AcceptChange了 , 然后行状态就变成unchanged了, 只要把这个属性置为false, fill 后, 就可以保持行状态为Added, 然后在update 函数里就不需要考虑行状态了.

以下为不太熟悉这两种操作的朋友列出源代码, 为了阅读方便,去掉了错误检查部分的代码,但在实际应用中, try语句是不可缺少的:
<0>调用代码:

1string path="upload";
2DataTable dt=ImportFromExcel(path);
3string selectCommand="SELECT * FROM T1";
4UpdateToDataBase(selectCommand,dt);

<1> 从excel 读取数据

 1DataTable ImportFromExcel(string path)
 2{
 3    path=Server.MapPath(path);
 4    upload1.PostFile.SaveAs(path);
 5
 6 string connString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + path +";Extended Properties='Excel 8.0;HDR=yes;IMEX=1;'";
 7    string selectCommand = " SELECT * FROM [Sheet1$] ";
 8   DataTable dt=new DataTable();
 9
10    System.Data.OleDb.OleDbConnection conn=new System.Data.OleDb.OleDbConnection(connString);
11    conn.Open();
12    System.Data.OleDb.OleDbCommand cmd = new System.Data.OleDb.OleDbCommand(selectCommand, conn);
13    System.Data.OleDb.OleDbDataAdapter adt = new System.Data.OleDb.OleDbDataAdapter(cmd);
14    adt.AcceptChangesDuringFill=false;
15    adt.Fill(dt);
16    conn.Close();
17    System.IO.File.Delete(path);
18    return dt;
19
20}

这里面的trick 就是第14 行.

<2>提交DataTable 到数据库

 1void UpdateToDataBase(string sql,DataTable dt)
 2{
 3    string connString=GetConnectionString();
 4
 5   System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection(connString);
 6   System.Data.SqlClient.SqlDataAdapter adt = new System.Data.SqlClient.SqlDataAdapter(sql, con);
 7   System.Data.SqlClient.SqlCommandBuilder builder = new System.Data.SqlClient.SqlCommandBuilder(adt);
 8    adt.InsertCommand=builder.GetInsertCommand();
 9    con.Open();
10    adt.Update(dt).ToString();
11    con.Close();
12}
13

转载于:https://www.cnblogs.com/Moosdau/archive/2007/12/21/1008959.html

在VS2003下把一个DataTable Update 到数据库相关推荐

  1. 一个可以编辑sqlite数据库的 数据库编辑小工具 sqlite数据库 替换字段,sql替换数据库中某个字段的所有值

    一个可以编辑sqlite数据库的 数据库编辑小工具,由于showdoc是不支持mysql数据库的,而我们需要去修改部分数据的时候需要用到sqlite数据库工具,因此这里推荐这个轻量工具: DB.Bro ...

  2. 假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健

    假设一个公司的医疗保健数据库有如下 3 个关系: 职工(职工号,姓名,性别,职务,家庭地址,部门编号) 部门(部门编号,部门名称,办公地址,电话) 保健(保健卡编号,职工号,检查身体日期,健康状况) ...

  3. 一个小时学会MySQL数据库

    致谢:一个小时学会MySQL数据库 一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库 ...

  4. 【转载】一个小时学会MySQL数据库

    一个小时学会MySQL数据库 目录 一.数据库概要 1.1.发展历史 1.1.1.人工处理阶段 1.1.2.文件系统 1.1.3.数据库管理系统 1.2.常见数据库技术品牌.服务与架构 1.3.数据库 ...

  5. mysql bulk update_Django bulk_create()、update()与数据库事务的效率对比分析

    下面以创建10000个对象为例进行测试: # 用for循环挨个创建,共花费37秒 for i in range(10000): name="String number %s"%i ...

  6. DataRow复制一行到另一个DataTable

    DataRow复制一行到另一个DataTable 下面两个方法是DataRow复制一行到另一个DataTable的,直接Add会出错"此行已属于另一个表",其实以前就知道怎么做的, ...

  7. 自己如何写mysql数据库_如何写一个属于自己的数据库封装(4)

    测试数据库来源 其实应该第一期就交出的, 但现在提起也无碍 参考了安装mysql示例数据库sakila 情景描述 我有一个用于测试的数据库(sakila), 里头有一个表(actor), 现在我们将它 ...

  8. 自己实现一个最简单的数据库

    自己实现一个最简单的数据库 July 4th , 2016 转载 codeceo 原文连接:http://www.codeceo.com/article/most-simple-database.ht ...

  9. 计划实现一个开源的KV数据库——Simple DB

    实现一个开源KV数据库的想法来源于对目前项目中所使用的K-V数据库使用情况的不满意. 先介绍一下我们的目前项目,作为本文的背景: 较为底层的分布式运行平台,使用C/C++实现的Actor模型(异步消息 ...

最新文章

  1. C++ transform for_each
  2. windows防火墙命令
  3. 计算机网络或计算机基础知识点滴1
  4. Python学习笔记(六)
  5. 金御® GM-AFM介绍
  6. C专家编程--读书笔记六 运行时数据结构
  7. 如下为利用Linux内核链表创建,Linux内核中链表的实现与应用
  8. php设计模式 命令行模式,[设计模式]PHP设计模式之命令行模式
  9. C++面试题-指针-动态内存指针
  10. thinkphp解决分页后序列号自增的问题
  11. 提取html中的音频文件,如何将网页中的音频文件提取出来
  12. MSG360虚拟服务器,H3C MSG360-10:简单设置+多场景结合应用
  13. 中西方对时间的差异_中西方时间观差异的跨文化分析
  14. 关于大数据,你应该知道的50个专业术语
  15. 微信小程序模仿拼多多APP地址选择样式
  16. 纯js图片验证码Captcha.js
  17. Android微信支付遇到的大坑
  18. 学生管理系统的设计与实现
  19. 数据库中LIMIT和 OFFSET的理解
  20. Unity XCode交互(unity调用讯飞的AIUI技能ios的sdk)

热门文章

  1. 嵩天python笔记_嵩天Python学习笔记-05
  2. tensorflow2 目标检测_基于光流的视频目标检测系列文章解读
  3. 判断frame是否已创建_类的创建
  4. java虚拟机手机下载_java虚拟机下载
  5. elementui表格中tip设置_VUE2.0+ElementUI2.0表格el-table:表头扩展el-tooltip
  6. PCM设备能在公网使用吗?
  7. 【渝粤教育】国家开放大学2018年秋季 2302T供应链管理 参考试题
  8. 【渝粤教育】 国家开放大学2020年春季 2246社会工作概论 参考试题
  9. 【渝粤题库】广东开放大学 人力资源本 形成性考核
  10. 【渝粤题库】广东开放大学 人力资源管理 形成性考核