指定路径下建立Access数据库并插入数据
2016-04-20 14:24 Moon-明月 阅读(640) 评论(0) 收藏 举报今天刚刚开通博客,想要把我这几天完成小任务的过程,记录下来。我从事软件开发的时间不到1年,写的不足之处,还请前辈们多多指教。
上周四也就是2016-04-14号上午,部门领导交给我一个小任务,概括来讲是根据Access(待拆分库,以下简称A)库中表a字段“分包序号”,在程序运行目录下建立以“序号“值命名的小库,a1,a2,a3,……,将A库中表a的数据根据“分包序号{”分组,分别插入到a1,a2,a3……各个小库下的a表中。
首先,我整理了下这个小任务的需求,分以下几步:
1) 确定在指定路径下要建立的小库的数量。
2) 在指定路径下建立小库,并建立小表。
3) 将数据插入到小表中。
下面将核心代码介绍下:
(1)建库。
建库的过程很是曲折,最终确定了这个方法——先在指定路径下建立一个名为Temp.mdb的库,然后根据去重之后的“分包序号”的列表,遍历列表,对Temp.mdb进行拷贝并且重命名的操作,建立所有的表。
1 /// <summary> 2 /// 根据分包序号建立小库和表 3 /// </summary> 4 /// <returns></returns> 5 private bool CreateTableByFBXH() 6 { 7 bool br = false; 8 if (Directory.Exists(dataSavePath)) 9 { 10 //先删除整个文件夹及下所有文件 11 Directory.Delete(dataSavePath, true); 12 //然后再新建一个空的文件夹 13 Directory.CreateDirectory(dataSavePath); 14 } 15 else 16 { 17 DirectoryInfo directoryInfo = new DirectoryInfo(dataSavePath); 18 directoryInfo.Create(); 19 } 20 21 //创建临时数据库 22 var tempMDBPath = dataSavePath + "Temp.mdb"; 23 while(!File.Exists(tempMDBPath)) 24 { 25 CreatTempMDB(tempMDBPath); 26 } 27 28 if (File.Exists(tempMDBPath)) 29 { 30 var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList(); 31 if (qkmxAccessList.Count > 0) 32 { 33 for (int i = 0; i < qkmxAccessList.Count; i++) 34 { 35 File.Copy(tempMDBPath, dataSavePath + qkmxAccessList[i] + ".mdb"); 36 if (i == qkmxAccessList.Count - 1) 37 { 38 br = true; 39 } 40 } 41 } 42 } 43 44 return br; 45 } 46 47 /// <summary> 48 /// 创建临时数据库 49 /// </summary> 50 /// <param name="strMDBPath"></param> 51 void CreatTempMDB(string strMDBPath) 52 { 53 //创建临时数据库 54 DynamicAccess tempMDB = new DynamicAccess(strMDBPath); 55 tempMDB.CreateAccess(); 56 tempMDB.CreateTable(); 57 }
(2)拆分大库
将A库a表中的数据读取到list,对list使用lambda表达式进行拆分(关键之处)。对拆分之后的list根据分包序号插入到指定的库表。
1 /// <summary> 2 /// 将downloadfile根据分包序号进行拆分并保存到对应的分包序号的库 3 /// </summary> 4 /// <param name="list"></param> 5 private void DivideListBySortNumber(IList<DownloadFile> list) 6 { 7 var qkmxAccessList = sourceFileList.Select(o => o.分包序号).Distinct().ToList(); 8 for (int i = 0; i < qkmxAccessList.Count; i++) 9 { 10 string strSortNum = qkmxAccessList[i]; 11 //lambda表达式 12 var _listSort = list.Where(o => o.分包序号 == strSortNum).ToList(); 13 String[] sqlArray = new string[_listSort.Count]; 14 for (int j = 0; j < _listSort.Count; j++) 15 { 16 //组合sql语句 17 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].提取时间); 18 } 19 //对数据进行批量写入 20 insertToStockDataByBatch(sqlArray, strSortNum + ".mdb"); 21 //InsertAccessBySqlParameter(strSortNum + ".mdb", _listSort); 22 if (i == qkmxAccessList.Count - 1) 23 { 24 MessageBox.Show("执行成功!"); 25 System.IO.File.Delete(dataSavePath + "Temp.mdb"); 26 } 27 } 28 }
(3)引用到的dll和类
引用的.dll是Adodb.dll和Interop.Adox.dll
引用的类如下:
1 /// <summary> 2 /// 创建库需要添加COM引用:Microsoft ADO Ext. 2.8 for DDL and Security 3 /// 创建数据表需要添加COM引用:Microsoft ActiveX Data Objects 2.8 Library 4 /// </summary> 5 public class DynamicAccess 6 { 7 8 public DynamicAccess(string local) 9 { 10 _DbPath = local; 11 } 12 13 private string _DbPath; 14 /// <summary> 15 /// ACCESS数据库路径,包含文件名称 16 /// </summary> 17 public string DbPath 18 { 19 get { return _DbPath; } 20 set { _DbPath = value; } 21 } 22 23 24 private string _strErrorInfo; 25 /// <summary> 26 /// 获取异常信息 27 /// </summary> 28 /// <returns></returns> 29 public string GetStrErrorInfo() 30 { 31 return _strErrorInfo; 32 } 33 34 /// <summary> 35 /// 动态创建ACCESS 36 /// </summary> 37 /// <returns></returns> 38 public bool CreateAccess() 39 { 40 try 41 { 42 ADOX.Catalog catalog = new ADOX.Catalog(); 43 catalog.Create("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath + ";Jet OLEDB:Engine Type=5"); 44 return true; 45 } 46 catch (Exception ex) 47 { 48 _strErrorInfo = ex.Message; 49 return false; 50 } 51 } 52 53 public bool CreateTable() 54 { 55 try 56 { 57 58 ADOX.Catalog catalog = new ADOX.Catalog(); 59 //创建链接 60 ADODB.Connection cn = new ADODB.Connection(); 61 //打开 62 cn.Open("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + DbPath, null, null, -1); 63 //激活链接 64 catalog.ActiveConnection = cn; 65 //创建表 66 ADOX.Table table = new ADOX.Table(); 67 table.Name = "待下载表"; 68 //创建列 69 ADOX.Column column = new ADOX.Column(); 70 column.ParentCatalog = catalog; 71 //列名称 72 column.Name = "ID"; 73 //列类型 74 column.Type = DataTypeEnum.adInteger; 75 //默认长度 76 column.DefinedSize = 9; 77 //自动增长列 78 column.Properties["AutoIncrement"].Value = true; 79 //将列添加到表中 80 table.Columns.Append(column, DataTypeEnum.adInteger, 9); 81 //第一列为主键 82 table.Keys.Append("FirstTablePrimaryKey", KeyTypeEnum.adKeyPrimary, column, null, null); 83 table.Columns.Append("商品ID", DataTypeEnum.adVarWChar, 255); 84 table.Columns.Append("URL", DataTypeEnum.adVarWChar, 255); 85 table.Columns.Append("IMG", DataTypeEnum.adVarWChar, 255); 86 table.Columns.Append("是否已下载", DataTypeEnum.adInteger, 9); 87 table.Columns.Append("状态", DataTypeEnum.adVarWChar, 255); 88 table.Columns.Append("分包序号", DataTypeEnum.adVarWChar, 255); 89 table.Columns.Append("图片代码来源", DataTypeEnum.adInteger, 9); 90 table.Columns.Append("商品特性", DataTypeEnum.adVarWChar, 255); 91 table.Columns.Append("图片文件名", DataTypeEnum.adVarWChar, 255); 92 table.Columns.Append("图片宽度", DataTypeEnum.adInteger, 9); 93 table.Columns.Append("图片高度", DataTypeEnum.adInteger, 9); 94 table.Columns.Append("图片大小", DataTypeEnum.adInteger, 9); 95 table.Columns.Append("CHECKER1", DataTypeEnum.adVarWChar, 255); 96 table.Columns.Append("MEMO1", DataTypeEnum.adVarWChar, 255); 97 table.Columns.Append("CHECKERDATE1", DataTypeEnum.adVarWChar, 255); 98 table.Columns.Append("CHECKER2", DataTypeEnum.adVarWChar, 255); 99 table.Columns.Append("MEMO2", DataTypeEnum.adVarWChar, 255); 100 table.Columns.Append("CHECKERDATE2", DataTypeEnum.adVarWChar, 255); 101 table.Columns.Append("KEYWORDS", DataTypeEnum.adVarWChar, 255); 102 table.Columns.Append("是否在包装上", DataTypeEnum.adInteger, 9); 103 table.Columns.Append("提取状态", DataTypeEnum.adVarWChar, 255); 104 table.Columns.Append("提取时间", DataTypeEnum.adVarWChar, 255); 105 catalog.Tables.Append(table); 106 107 cn.Close(); 108 109 return true; 110 } 111 catch (Exception ex) 112 { 113 _strErrorInfo = ex.Message; 114 return false; 115 } 116 117 } 118 119 }
虽然这是个小任务,但是我却花费了好几天才完成。希望自己坚持写博客,在写博客的过程中不断成长。
浙公网安备 33010602011771号