代码改变世界

指定路径下建立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     }

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