指定路径下建立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 ...
随机推荐
- 读书笔记--C陷阱与缺陷(一)
要参与C语言项目,于是作者只好重拾C语言(之前都是C++,还是C++方便). 看到大家都推荐看看 C陷阱与缺陷(C traps and pitfalls),于是好奇的开始了这本书的读书之旅. 决定将 ...
- struts分页实现
- 中科微北斗定位模组ATGM336H简介
36H系列卫星定位模块 产品介绍 ATGM336H是高灵敏度,支持BDS/GPS/GLONASS卫星导航系统的单系统定位,以及任意组合的多系统联合定位的接收机模块.ATGM336H基于本公司自主独立研 ...
- MariaDB体验2----CSV文件导入
之前已经安装好MariaDB,现在需要将一份从Sql Server数据库里面导出的CSV文件导入进MariaDB,期间碰到了各种坑,这里记录一下. HeidiSQL的导入CSV文件的地方在“工具”栏, ...
- 最近找java实习面试被问到的东西总结(Java方向)
时间,就是这么很悄悄的溜走了将近两个年华,不知不觉的,研二了,作为一个一般学校的研究生,不知道该说自己是不学无术,还是说有过努力,反正,这两年里,有过坚持,有过堕落,这不,突然间,有种开窍的急迫感,寻 ...
- ROS学习记录(二)————使用smartcar进行仿真(用.xacro文件来运行rviz)
我发现一个学习ROS系统的好网站: 创客智造http://www.ncnynl.com/ 这里面关于ROS的各个方面都有很详细的介绍. 这周,不,上周我对整个ROS是绝望的,我用一个一个下午的时间在敲 ...
- vue-cli中父子组件间的变量传递
vue-cli中父子组件间的变量传递 在vue中每一个组件的作用域都是独立的,如果我们想实现父子组件间变量的传递就要另寻他法,而不能直接调用其中的变量. 父级组件向子级组件传递变量 要实现这种效果我们 ...
- 原生的AJAX
var XHR=null; if (window.XMLHttpRequest) { // 非IE内核 XHR = new XMLHttpRequest(); } else if (window.Ac ...
- 吐槽下微软的vs code编辑器
缺点:不能同时打开多个文件夹(打开多个文件夹得先ctrl+shift+N窗口或者除非你的所有项目文件都在同一个文件夹目录下) 优点是支持用户设置以及提供很多插件 // 将设置放入此文件中以覆盖默认设置 ...
- 201521123084 《Java程序设计》第14周学习总结
1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结数据库相关内容. answer: 2. 书面作业 1. MySQL数据库基本操作 1.1 建立数据库test.表studen ...