指定路径下建立Access数据库并插入数据
今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来。我从事软件开发的时间不到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数据库并插入数据的更多相关文章
- 初识TypeScript:查找指定路径下的文件按类型生成json
如果开发过node.js的话应该对js(javascript)非常熟悉,TypeScript(以下简称ts)是js的超集. 下面是ts的官网: https://www.tslang.cn/ 1.环境配 ...
- C#实现把指定文件夹下的所有文件复制到指定路径下以及修改指定文件的后缀名
1.实现把指定文件夹下的所有文件复制到指定路径下 public static void copyFiles(string path) { DirectoryInfo dir = new Directo ...
- java 压缩文件 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件
/** * 传入文件数组,压缩文件,在指定路径下生成指定文件名的压缩文件 * * @param files * 文件数组 * @param strZipName * 压缩文件路径及文件名 * @thr ...
- matlab读取指定路径下的图像
利用matlab读取指定路径下的图像 %% 读入指定路径imgFolder下的图像imgName imgFolder = 'F:\博\快盘\图像+数据\images\文章实验图'; %指定路径 img ...
- C# 获取指定路径下的文件结构(树形结构)
namespace Vue.Content { public class FileNames { public int id { get; set; } public string text { ge ...
- python之实现循环查看指定路径下的所有文件---os.walk
循环查看指定路径下的所有文件.文件夹,包含隐藏文件注:“.filename” 以点开头的是隐藏文件 import os for cur_path,cur_dirs,cur_files in os.wa ...
- java监控指定路径下文件及文件夹变化
之前用jdk7的WatchService API(java.nio.file包)来做目录下的子文件监控,后改为使用commons-io包.主要有下面几点不同:1. WatchService是采用扫描式 ...
- Python3在指定路径下递归定位文件中出现的字符串
[本文出自天外归云的博客园] 脚本功能:在指定的路径下递归搜索,找出指定字符串在文件中出现的位置(行信息). 用到的python特性: 1. PEP 318 -- Decorators for Fun ...
- 【Lua】关于遍历指定路径下所有目录及文件
关于Lua中如何遍历指定文件路径下的所有文件,需要用到Lua的lfs库. 首先创建一个temp.lua文件,用编辑器打开: 要使用lfs库,首先需要把lfs库加载进来 require("lf ...
随机推荐
- 《Java从入门到放弃》JavaSE篇:综合练习——单身狗租赁系统(数组版)
因为现在只学习了基本语法,所以在综合练习之前,先补充关于方法概念. 方法的作用:把一系列的代码放在一起,然后再取个别名.之后通过这个别名的调用,就相当于执行了这一系列的代码. 方法的语法:([]中的内 ...
- [日推荐] 『闲聊助手』人工智能小程序,仅此一款!-极乐商店store.dreawer.com
肾phone的siri有用过吗?小编无聊时就撩一下她!但有个问题就是要是没有肾phone在身边怎么撩???现在有伙伴@wx_Volcano_Li76 开发一款小程序,可以等同于siri,想什么时候撩就 ...
- javaSE基础之 ArrayList的底层简单实现
最近就是想扒一扒存在硬盘里面的学习资料(突然想到什么),把以前写过的一些东西整理一下分享出来. 这边是ArrayList 的简单实现,当然只实现了部分方法 package com.yck.collec ...
- python进阶学习(四)
在使用多线程之前,我们首页要理解什么是进程和线程. 什么是进程? 计算机程序只不过是磁盘中可执行的,二进制(或其它类型)的数据.它们只有在被读取到内存中,被操作系统调用的时候才开始它们的生命期.进程( ...
- JS面向对象编程(进阶理解)
JS 面向对象编程 如何创建JS对象 JSON语法声明对象(直接量声明对象) var obj = {}; 使用 Object 创建对象 var obj = new Object(); JS对象可以后期 ...
- 【转载】makefile经典教程
该篇文章为转载,是对原作者系列文章的总汇加上标注. 支持原创,请移步陈浩大神博客: http://blog.csdn.net/haoel/article/details/2886 makefile很重 ...
- spring 整合Mybatis 错误:Parameter 'items_id' not found. Available parameters are [array]
运行环境:jdk1.7.0_17+tomcat 7 + spring:3.2.0 +mybatis:3.2.7+ eclipse 错误:Parameter 'items_id' not found. ...
- mysql 索引B-Tree类型对索引使用的生效和失效情况详解
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt343 当人们谈论索引的时候,如果没有特别指明类型 ,那多半说的是 B-Tre ...
- 【Java IO流】对象的序列化和反序列化
对象的序列化和反序列化 1)对象序列化,就是将Object对象转换成byte序列,反之叫对象的反序列化. 2)序列化流(ObjectOutputStream),是字节的过滤流—— writeObjec ...
- 【★】微信之于QQ的市场哲学
2016年的移动app下载排行榜出炉后,我们惊奇发现,前十名中有6个应用软件来自腾讯公司.而前两名毋庸置疑是远远碾压第三名的微信与qq.这让我们看到社交app的重要性的同时也回到了那个原始的问题:腾讯 ...