今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来。我从事软件开发的时间不到1年,写的不足之处,还请前辈们多多指教。

上周四也就是2016-04-14号上午,部门领导交给我一个小任务,概括来讲是根据Access(待拆分库,以下简称A)库中表a字段“分包序号”,在程序运行目录下建立以“序号“值命名的小库,a1,a2,a3,……,将A库中表a的数据根据“分包序号{”分组,分别插入到a1,a2,a3……各个小库下的a表中。

首先,我整理了下这个小任务的需求,分以下几步:

1)     确定在指定路径下要建立的小库的数量。

2)     在指定路径下建立小库,并建立小表。

3)     将数据插入到小表中。

下面将核心代码介绍下:

(1)建库。

建库的过程很是曲折,最终确定了这个方法——先在指定路径下建立一个名为Temp.mdb的库,然后根据去重之后的“分包序号”的列表,遍历列表,对Temp.mdb进行拷贝并且重命名的操作,建立所有的表。

  1. /// <summary>
  2. /// 根据分包序号建立小库和表
  3. /// </summary>
  4. /// <returns></returns>
  5. private bool CreateTableByFBXH()
  6. {
  7. bool br = false;
  8. if (Directory.Exists(dataSavePath))
  9. {
  10. //先删除整个文件夹及下所有文件
  11. Directory.Delete(dataSavePath, true);
  12. //然后再新建一个空的文件夹
  13. Directory.CreateDirectory(dataSavePath);
  14. }
  15. else
  16. {
  17. DirectoryInfo directoryInfo = new DirectoryInfo(dataSavePath);
  18. directoryInfo.Create();
  19. }
  20.  
  21. //创建临时数据库
  22. var tempMDBPath = dataSavePath + "Temp.mdb";
  23. while(!File.Exists(tempMDBPath))
  24. {
  25. CreatTempMDB(tempMDBPath);
  26. }
  27.  
  28. if (File.Exists(tempMDBPath))
  29. {
  30. var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList();
  31. if (qkmxAccessList.Count > )
  32. {
  33. for (int i = ; i < qkmxAccessList.Count; i++)
  34. {
  35. File.Copy(tempMDBPath, dataSavePath + qkmxAccessList[i] + ".mdb");
  36. if (i == qkmxAccessList.Count - )
  37. {
  38. br = true;
  39. }
  40. }
  41. }
  42. }
  43.  
  44. return br;
  45. }
  46.  
  47. /// <summary>
  48. /// 创建临时数据库
  49. /// </summary>
  50. /// <param name="strMDBPath"></param>
  51. void CreatTempMDB(string strMDBPath)
  52. {
  53. //创建临时数据库
  54. DynamicAccess tempMDB = new DynamicAccess(strMDBPath);
  55. tempMDB.CreateAccess();
  56. tempMDB.CreateTable();
  57. }

(2)拆分大库

将A库a表中的数据读取到list,对list使用lambda表达式进行拆分(关键之处)。对拆分之后的list根据分包序号插入到指定的库表。

  1. /// <summary>
  2. /// 将downloadfile根据分包序号进行拆分并保存到对应的分包序号的库
  3. /// </summary>
  4. /// <param name="list"></param>
  5. private void DivideListBySortNumber(IList<DownloadFile> list)
  6. {
  7. var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList();
  8. for (int i = ; i < qkmxAccessList.Count; i++)
  9. {
  10. string strSortNum = qkmxAccessList[i];
  11. //lambda表达式
  12. var _listSort = list.Where(o => o.分包序号 == strSortNum).ToList();
  13. String[] sqlArray = new string[_listSort.Count];
  14. for (int j = ; j < _listSort.Count; j++)
  15. {
  16. //组合sql语句
  17. sqlArray[j] = generateSQLSentence(Convert.ToInt32(_listSort[j].ID), _listSort[j].商品ID.ToString(), _listSort[j].URL, _listSort[j].IMG, _listSort[j].是否已下载, _listSort[j].状态, _listSort[j].分包序号, Convert.ToInt32(_listSort[j].图片代码来源), _listSort[j].商品特性, _listSort[j].图片文件名, Convert.ToInt32(_listSort[j].图片宽度), Convert.ToInt32(_listSort[j].图片高度), Convert.ToInt32(_listSort[j].图片大小), _listSort[j].CHECKER1, _listSort[j].MEMO1, _listSort[j].CHECKERDATE1, _listSort[j].CHECKER2, _listSort[j].MEMO2, _listSort[j].CHECKERDATE2, _listSort[j].KEYWORDS, Convert.ToInt32(_listSort[j].是否在包装上), _listSort[j].提取状态, _listSort[j].提取时间);
  18. }
  19. //对数据进行批量写入
  20. insertToStockDataByBatch(sqlArray, strSortNum + ".mdb");
  21. //InsertAccessBySqlParameter(strSortNum + ".mdb", _listSort);
  22. if (i == qkmxAccessList.Count - )
  23. {
  24. MessageBox.Show("执行成功!");
  25. System.IO.File.Delete(dataSavePath + "Temp.mdb");
  26. }
  27. }
  28. }

(3)引用到的dll和类

引用的.dll是Adodb.dll和Interop.Adox.dll

引用的类如下:

  1. /// <summary>
  2. /// 创建库需要添加COM引用:Microsoft ADO Ext. 2.8 for DDL and Security
  3. /// 创建数据表需要添加COM引用:Microsoft ActiveX Data Objects 2.8 Library
  4. /// </summary>
  5. public class DynamicAccess
  6. {
  7.  
  8. public DynamicAccess(string local)
  9. {
  10. _DbPath = local;
  11. }
  12.  
  13. private string _DbPath;
  14. /// <summary>
  15. /// ACCESS数据库路径,包含文件名称
  16. /// </summary>
  17. public string DbPath
  18. {
  19. get { return _DbPath; }
  20. set { _DbPath = value; }
  21. }
  22.  
  23. private string _strErrorInfo;
  24. /// <summary>
  25. /// 获取异常信息
  26. /// </summary>
  27. /// <returns></returns>
  28. public string GetStrErrorInfo()
  29. {
  30. return _strErrorInfo;
  31. }
  32.  
  33. /// <summary>
  34. /// 动态创建ACCESS
  35. /// </summary>
  36. /// <returns></returns>
  37. public bool CreateAccess()
  38. {
  39. try
  40. {
  41. ADOX.Catalog catalog = new ADOX.Catalog();
  42. catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";Jet OLEDB:Engine Type=5");
  43. return true;
  44. }
  45. catch (Exception ex)
  46. {
  47. _strErrorInfo = ex.Message;
  48. return false;
  49. }
  50. }
  51.  
  52. public bool CreateTable()
  53. {
  54. try
  55. {
  56.  
  57. ADOX.Catalog catalog = new ADOX.Catalog();
  58. //创建链接
  59. ADODB.Connection cn = new ADODB.Connection();
  60. //打开
  61. cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath, null, null, -);
  62. //激活链接
  63. catalog.ActiveConnection = cn;
  64. //创建表
  65. ADOX.Table table = new ADOX.Table();
  66. table.Name = "待下载表";
  67. //创建列
  68. ADOX.Column column = new ADOX.Column();
  69. column.ParentCatalog = catalog;
  70. //列名称
  71. column.Name = "ID";
  72. //列类型
  73. column.Type = DataTypeEnum.adInteger;
  74. //默认长度
  75. column.DefinedSize = ;
  76. //自动增长列
  77. column.Properties["AutoIncrement"].Value = true;
  78. //将列添加到表中
  79. table.Columns.Append(column, DataTypeEnum.adInteger, );
  80. //第一列为主键
  81. table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);
  82. table.Columns.Append("商品ID", DataTypeEnum.adVarWChar, );
  83. table.Columns.Append("URL", DataTypeEnum.adVarWChar, );
  84. table.Columns.Append("IMG", DataTypeEnum.adVarWChar, );
  85. table.Columns.Append("是否已下载", DataTypeEnum.adInteger, );
  86. table.Columns.Append("状态", DataTypeEnum.adVarWChar, );
  87. table.Columns.Append("分包序号", DataTypeEnum.adVarWChar, );
  88. table.Columns.Append("图片代码来源", DataTypeEnum.adInteger, );
  89. table.Columns.Append("商品特性", DataTypeEnum.adVarWChar, );
  90. table.Columns.Append("图片文件名", DataTypeEnum.adVarWChar, );
  91. table.Columns.Append("图片宽度", DataTypeEnum.adInteger, );
  92. table.Columns.Append("图片高度", DataTypeEnum.adInteger, );
  93. table.Columns.Append("图片大小", DataTypeEnum.adInteger, );
  94. table.Columns.Append("CHECKER1", DataTypeEnum.adVarWChar, );
  95. table.Columns.Append("MEMO1", DataTypeEnum.adVarWChar, );
  96. table.Columns.Append("CHECKERDATE1", DataTypeEnum.adVarWChar, );
  97. table.Columns.Append("CHECKER2", DataTypeEnum.adVarWChar, );
  98. table.Columns.Append("MEMO2", DataTypeEnum.adVarWChar, );
  99. table.Columns.Append("CHECKERDATE2", DataTypeEnum.adVarWChar, );
  100. table.Columns.Append("KEYWORDS", DataTypeEnum.adVarWChar, );
  101. table.Columns.Append("是否在包装上", DataTypeEnum.adInteger, );
  102. table.Columns.Append("提取状态", DataTypeEnum.adVarWChar, );
  103. table.Columns.Append("提取时间", DataTypeEnum.adVarWChar, );
  104. catalog.Tables.Append(table);
  105.  
  106. cn.Close();
  107.  
  108. return true;
  109. }
  110. catch (Exception ex)
  111. {
  112. _strErrorInfo = ex.Message;
  113. return false;
  114. }
  115.  
  116. }
  117.  
  118. }

虽然这是个小任务,但是我却花费了好几天才完成。希望自己坚持写博客,在写博客的过程中不断成长。

指定路径下建立Access数据库并插入数据的更多相关文章

  1. 初识TypeScript:查找指定路径下的文件按类型生成json

    如果开发过node.js的话应该对js(javascript)非常熟悉,TypeScript(以下简称ts)是js的超集. 下面是ts的官网: https://www.tslang.cn/ 1.环境配 ...

  2. C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名

    1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...

  3. java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件

    /** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...

  4. matlab读取指定路径下的图像

    利用matlab读取指定路径下的图像 %% 读入指定路径imgFolder下的图像imgName imgFolder = 'F:\博\快盘\图像+数据\images\文章实验图'; %指定路径 img ...

  5. C# 获取指定路径下的文件结构(树形结构)

    namespace Vue.Content { public class FileNames { public int id { get; set; } public string text { ge ...

  6. python之实现循环查看指定路径下的所有文件---os.walk

    循环查看指定路径下的所有文件.文件夹,包含隐藏文件注:“.filename” 以点开头的是隐藏文件 import os for cur_path,cur_dirs,cur_files in os.wa ...

  7. java监控指定路径下文件及文件夹变化

    之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...

  8. Python3在指定路径下递归定位文件中出现的字符串

    [本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 1. PEP 318 -- Decorators for Fun ...

  9. 【Lua】关于遍历指定路径下所有目录及文件

    关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...

随机推荐

  1. 如何理解 Python 的赋值逻辑

    摘要: 如果你学过 C 语言,那么当你初见 Python 时可能会觉得 Python 的赋值方式略有诡异:好像差不多,但又好像哪里有点不太对劲. 本文比较并解释了这种赋值逻辑上的差异.回答了为什么需要 ...

  2. webpack教程(六)——分离组件代码

    先来运行一下webpack命令, 看到app.js才4k. 安装一下react npm install react --sava-dev 在app/index.js文件内引入react 运行webpa ...

  3. [2015-11-23]分享一个批处理脚本,创建iis站点及程序池

    建站批处理 batch_createSites.bat @echo off rem 以管理员身份执行本脚本,可添加多条call 以建立多个站点 call path\to\createSites.bat ...

  4. sizeof(void)有什么用

    偶然发现在C中sizeof(void)是合法的,于是,对它的作用产生了疑问.查阅资料在GNU文档中发现如下解释: In GNU C, addition and subtraction operatio ...

  5. 【搬运工】之——Selenium+IDEA+Maven+TestNG环境搭建(转)

    Selenium+IDEA+Maven+TestNG环境搭建 第一 安装java环境. 1. 下载并安装Jdk1.7或Jdk1.8 http://www.oracle.com/technetwork/ ...

  6. tp下的memcached运用

    来源:http://blog.csdn.net/fudaoji/article/details/50722839   侵删 一.环境: lnmp开发服务器, memcached2.2.0,thinkp ...

  7. poj1236强连通缩点

    题意:给出每个学校的list 代表该学校能链接的其他学校,问1:至少给几个学校资源使所有学校都得到:2:至少加多少个边能让所有学校相互连通: 思路:1:找出缩点后入度为零的点个数  2:找出缩点后入度 ...

  8. 二,ESP8266 GPIO和SPI和定时器和串口

    让这个灯亮 我们写lua用这个软件 链接:http://pan.baidu.com/s/1kVN09cr 密码:pfv7 http://www.cnblogs.com/yangfengwu/p/624 ...

  9. Bootstrap框架菜鸟入门教程

    Bootstrap菜鸟入门教程 Bootstrap简介 Bootstrap,来自 Twitter,是目前最受欢迎的前端框架.Bootstrap 是基于 HTML.CSS.JAVASCRIPT 的,它简 ...

  10. 用webgl打造自己的3D迷宫游戏

    用webgl打造自己的3D迷宫游戏 2016/09/19 · JavaScript · WebGL 原文出处: AlloyTeam    背景:前段时间自己居然迷路了,有感而发就想到写一个可以让人迷路 ...