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

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

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

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

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

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

下面将核心代码介绍下:

(1)建库。

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

  /// <summary>
/// 根据分包序号建立小库和表
/// </summary>
/// <returns></returns>
private bool CreateTableByFBXH()
{
bool br = false;
if (Directory.Exists(dataSavePath))
{
//先删除整个文件夹及下所有文件
Directory.Delete(dataSavePath, true);
//然后再新建一个空的文件夹
Directory.CreateDirectory(dataSavePath);
}
else
{
DirectoryInfo directoryInfo = new DirectoryInfo(dataSavePath);
directoryInfo.Create();
} //创建临时数据库
var tempMDBPath = dataSavePath + "Temp.mdb";
while(!File.Exists(tempMDBPath))
{
CreatTempMDB(tempMDBPath);
} if (File.Exists(tempMDBPath))
{
var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList();
if (qkmxAccessList.Count > )
{
for (int i = ; i < qkmxAccessList.Count; i++)
{
File.Copy(tempMDBPath, dataSavePath + qkmxAccessList[i] + ".mdb");
if (i == qkmxAccessList.Count - )
{
br = true;
}
}
}
} return br;
} /// <summary>
/// 创建临时数据库
/// </summary>
/// <param name="strMDBPath"></param>
void CreatTempMDB(string strMDBPath)
{
//创建临时数据库
DynamicAccess tempMDB = new DynamicAccess(strMDBPath);
tempMDB.CreateAccess();
tempMDB.CreateTable();
}

(2)拆分大库

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

  /// <summary>
/// 将downloadfile根据分包序号进行拆分并保存到对应的分包序号的库
/// </summary>
/// <param name="list"></param>
private void DivideListBySortNumber(IList<DownloadFile> list)
{
var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList();
for (int i = ; i < qkmxAccessList.Count; i++)
{
string strSortNum = qkmxAccessList[i];
//lambda表达式
var _listSort = list.Where(o => o.分包序号 == strSortNum).ToList();
String[] sqlArray = new string[_listSort.Count];
for (int j = ; j < _listSort.Count; j++)
{
//组合sql语句
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].提取时间);
}
//对数据进行批量写入
insertToStockDataByBatch(sqlArray, strSortNum + ".mdb");
//InsertAccessBySqlParameter(strSortNum + ".mdb", _listSort);
if (i == qkmxAccessList.Count - )
{
MessageBox.Show("执行成功!");
System.IO.File.Delete(dataSavePath + "Temp.mdb");
}
}
}

(3)引用到的dll和类

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

引用的类如下:

  /// <summary>
/// 创建库需要添加COM引用:Microsoft ADO Ext. 2.8 for DDL and Security
/// 创建数据表需要添加COM引用:Microsoft ActiveX Data Objects 2.8 Library
/// </summary>
public class DynamicAccess
{ public DynamicAccess(string local)
{
_DbPath = local;
} private string _DbPath;
/// <summary>
/// ACCESS数据库路径,包含文件名称
/// </summary>
public string DbPath
{
get { return _DbPath; }
set { _DbPath = value; }
} private string _strErrorInfo;
/// <summary>
/// 获取异常信息
/// </summary>
/// <returns></returns>
public string GetStrErrorInfo()
{
return _strErrorInfo;
} /// <summary>
/// 动态创建ACCESS
/// </summary>
/// <returns></returns>
public bool CreateAccess()
{
try
{
ADOX.Catalog catalog = new ADOX.Catalog();
catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";Jet OLEDB:Engine Type=5");
return true;
}
catch (Exception ex)
{
_strErrorInfo = ex.Message;
return false;
}
} public bool CreateTable()
{
try
{ ADOX.Catalog catalog = new ADOX.Catalog();
//创建链接
ADODB.Connection cn = new ADODB.Connection();
//打开
cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath, null, null, -);
//激活链接
catalog.ActiveConnection = cn;
//创建表
ADOX.Table table = new ADOX.Table();
table.Name = "待下载表";
//创建列
ADOX.Column column = new ADOX.Column();
column.ParentCatalog = catalog;
//列名称
column.Name = "ID";
//列类型
column.Type = DataTypeEnum.adInteger;
//默认长度
column.DefinedSize = ;
//自动增长列
column.Properties["AutoIncrement"].Value = true;
//将列添加到表中
table.Columns.Append(column, DataTypeEnum.adInteger, );
//第一列为主键
table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null);
table.Columns.Append("商品ID", DataTypeEnum.adVarWChar, );
table.Columns.Append("URL", DataTypeEnum.adVarWChar, );
table.Columns.Append("IMG", DataTypeEnum.adVarWChar, );
table.Columns.Append("是否已下载", DataTypeEnum.adInteger, );
table.Columns.Append("状态", DataTypeEnum.adVarWChar, );
table.Columns.Append("分包序号", DataTypeEnum.adVarWChar, );
table.Columns.Append("图片代码来源", DataTypeEnum.adInteger, );
table.Columns.Append("商品特性", DataTypeEnum.adVarWChar, );
table.Columns.Append("图片文件名", DataTypeEnum.adVarWChar, );
table.Columns.Append("图片宽度", DataTypeEnum.adInteger, );
table.Columns.Append("图片高度", DataTypeEnum.adInteger, );
table.Columns.Append("图片大小", DataTypeEnum.adInteger, );
table.Columns.Append("CHECKER1", DataTypeEnum.adVarWChar, );
table.Columns.Append("MEMO1", DataTypeEnum.adVarWChar, );
table.Columns.Append("CHECKERDATE1", DataTypeEnum.adVarWChar, );
table.Columns.Append("CHECKER2", DataTypeEnum.adVarWChar, );
table.Columns.Append("MEMO2", DataTypeEnum.adVarWChar, );
table.Columns.Append("CHECKERDATE2", DataTypeEnum.adVarWChar, );
table.Columns.Append("KEYWORDS", DataTypeEnum.adVarWChar, );
table.Columns.Append("是否在包装上", DataTypeEnum.adInteger, );
table.Columns.Append("提取状态", DataTypeEnum.adVarWChar, );
table.Columns.Append("提取时间", DataTypeEnum.adVarWChar, );
catalog.Tables.Append(table); cn.Close(); return true;
}
catch (Exception ex)
{
_strErrorInfo = ex.Message;
return false;
} } }

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

指定路径下建立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. JS组件系列——再推荐一款好用的bootstrap-select组件,亲测还不错

    前言:之前分享过两篇bootstrap下拉框的组件:JS组件系列——两种bootstrap multiselect组件大比拼  和 JS组件系列——Bootstrap Select2组件使用小结 ,收 ...

  2. GridView用法详解

    前台页面: Default.aspx <%@ Page Language="C#" AutoEventWireup="true" CodeFile=&qu ...

  3. [2017-09-04]Abp系列——为什么值对象必须设计成不可变的

    本系列目录:Abp介绍和经验分享-目录 这篇是之前翻备忘录发现漏了的,前阵子刚好同事又提及过这个问题,这里补上. 本文重点在于理解什么是值对象的不可变性. Abp的ValueObject以及EF的Co ...

  4. 浅谈JS的继承

    JS继承 继承是OO语言中最为人津津乐道的概念,许多OO语言都支持两种方式的继承:接口继承:实现继承. 接口继承:只继承方法签名. 实现继承:继承实际的方法. 由于ES里函数没有签名,所以在ES里面无 ...

  5. asp.net core策略授权

    在<asp.net core认证与授权>中讲解了固定和自定义角色授权系统权限,其实我们还可以通过其他方式来授权,比如可以通过角色组,用户名,生日等,但这些主要取决于ClaimTypes,其 ...

  6. 【转】Java虚拟机的JVM垃圾回收机制

    详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcytp43       1.JVM内存空间     JVM堆(Heap)= 新生代 ...

  7. 转: 【Java并发编程】之二十一:并发新特性—阻塞队列和阻塞栈(含代码)

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17511147 阻塞队列 阻塞队列是Java5并发新特性中的内容,阻塞队列的接口是Java. ...

  8. 团队作业4——第一次项目冲刺(ALpha版本)第三天

    一.Daily Scrum Meeting照片 二.燃尽图 三.项目进展 1.界面 完成了前端的HTML页面设计 2.功能 完成了后端数据处理的全部基本功能: 数据结构设计及数据交互操作 博客页面数据 ...

  9. 201521123110 《Java程序设计》第7周学习总结

    1. 本章学习总结 2. 书面作业 1.ArrayList代码分析 1.1 解释ArrayList的contains源代码 public boolean contains(Object o) { re ...

  10. 201521123114 《Java程序设计》第3周学习总结

    1. 本章学习总结 2. 书面作业 Q1.代码阅读 以上代码可否编译通过?哪里会出错?为什么?尝试改正? 如果创建3个Test1对象,有内存中有几个i,几个j?请分析原因? 不能编译通过,Test1g ...