指定路径下建立Access数据库并插入数据
2024-09-17 17:26:25
今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来。我从事软件开发的时间不到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;
} } }
虽然这是个小任务,但是我却花费了好几天才完成。希望自己坚持写博客,在写博客的过程中不断成长。
最新文章
- 239. Sliding Window Maximum *HARD* -- 滑动窗口的最大值
- Count Complete Tree Nodes || LeetCode
- 双节点(nginx+keepalived)为两台apache服务器提供负载均衡
- make clean、make mrproer、make distclean
- 关于异常的疑难解答:System.Runtime.InteropServices.COMException
- 我的第一个微信小程序
- Centos7 设置vim 显示文本不同颜色
- (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
- 学员会诊之02:SVN协作以及Page类的设计
- 愿你走出半生,归来仍是Java Parser
- 解决iredmail下postfix发送邮件时报错[need fully-qualified hostname]
- 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
- NO.6LINUX基本命令
- How does flyway sort version numbers?
- 创建image
- Vim:gvim安装配置(windows)
- Vue.js:目标结构
- java后台输入数据的2种方式
- Ubuntu下CodeBlocks更改调试终端
- 第九章-IO编程