今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来。我从事软件开发的时间不到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;
} } }

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

最新文章

  1. 239. Sliding Window Maximum *HARD* -- 滑动窗口的最大值
  2. Count Complete Tree Nodes || LeetCode
  3. 双节点(nginx+keepalived)为两台apache服务器提供负载均衡
  4. make clean、make mrproer、make distclean
  5. 关于异常的疑难解答:System.Runtime.InteropServices.COMException
  6. 我的第一个微信小程序
  7. Centos7 设置vim 显示文本不同颜色
  8. (4).NET CORE微服务 Micro-Service ---- Consul服务发现和消费
  9. 学员会诊之02:SVN协作以及Page类的设计
  10. 愿你走出半生,归来仍是Java Parser
  11. 解决iredmail下postfix发送邮件时报错[need fully-qualified hostname]
  12. 转载自(http://snailz.diandian.com/post/2012-10-24/40041265730)
  13. NO.6LINUX基本命令
  14. How does flyway sort version numbers?
  15. 创建image
  16. Vim:gvim安装配置(windows)
  17. Vue.js:目标结构
  18. java后台输入数据的2种方式
  19. Ubuntu下CodeBlocks更改调试终端
  20. 第九章-IO编程

热门文章

  1. Spring(四)-- JdbcTemplate、声明式事务
  2. Java基础---IO(三)--IO包中的其他类
  3. iOS 微信支付流程详解
  4. js学习--变量作用域和作用域链
  5. Java泛型:泛型类,泛型接口和泛型方法
  6. 浏览器控制台console的使用
  7. javascript中用setAttribute给元素添加colspan属性无效
  8. vue学习日志(一):vue的优势
  9. 常用按钮css
  10. tomcat学习笔记