Excel导入数据库过程中遇到的问题
来源:互联网 发布:模拟人生4帅哥捏脸数据 编辑:程序博客网 时间:2024/06/04 17:51
这次的excel与以往的不同,首先根据excel中的中文名称找到数据表中的列属性的说明属性,若一直,则excel中的列对应数据表的列;其次excel第一行是备注行,第二行是列名,后面才是数据行。
这样处理的好处是,以后客户更改excel模板,改变导入的信息,系统不需变更代码,比较灵活。
第一步:
从数据库中找出数据表列名与说明属性的对应关系:
private DataTable dtNameMapping; public DataTable DtNameMapping { get { if (dtNameMapping == null) { dtNameMapping = new DataTable(); if (!string.IsNullOrEmpty(tableName)) { //用函数fn_listextendedproperty找出列名与说明属性的对应关系 string sql = string.Format(@"SELECT cast(objname as varchar(64)) objname ,cast(value as varchar(64)) value FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', '{0}', 'column', default)", tableName); dtNameMapping = KPMSDatabase.KPMSDB.ExecuteDataSet(CommandType.Text, sql).Tables[0]; } } return dtNameMapping; } }
第二步:
将excel读入到DataTable中,方便数据操作;
/// <summary> /// 将Excel转化为一张表 /// </summary> /// <param name="fudExcel">控件id</param> /// <param name="sheetName">工作子表名</param> /// <returns></returns> public DataTable GetExcelDataTable(FileUpload fudExcel, string sheetName) { DataTable dt = new DataTable(); string strConn = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + fudExcel.PostedFile.FileName + ";Extended Properties=\"Excel 12.0;HDR=YES;IMEX=1\""; ; OleDbConnection Conn = new OleDbConnection(strConn); string sheet = "[" + sheetName + "$]"; string strCom = string.Format("SELECT * FROM {0} WHERE 1=1 ", sheet); if (!string.IsNullOrEmpty(ExcelRow)) { strCom += ExcelRow; } try { Conn.Open(); OleDbDataAdapter comm = new OleDbDataAdapter(strCom, Conn); comm.Fill(dt); Conn.Close(); dt = IgnoreExcelRowA(dt); } catch (Exception ex) { Conn.Close(); //throw new Exception("Excel文件存在异常"); throw ex; } return dt; }
/// <summary> /// 去掉第一行,将第二行改为表的列名, /// </summary> /// <param name="DtExcel"></param> /// <returns></returns> private DataTable IgnoreExcelRowA(DataTable DtExcel) {
if (DtExcel.Columns[0].ColumnName.IndexOf("必填项") >= 0) {
if (DtExcel.Rows.Count > 0) { DataRow dr = DtExcel.Rows[0];
for (int n = 0; n < DtExcel.Columns.Count; n++) { if (!string.IsNullOrEmpty(dr[n].ToString())) { DtExcel.Columns[n].ColumnName = dr[n].ToString().Trim().Replace("'",""); } } DtExcel.Rows.RemoveAt(0); DtExcel.AcceptChanges(); } }
return DtExcel; }
第三步:
根据excel表中的列名,对比数据库,找出对应的字段名:
/// <summary> /// 判断Excel中的列是否存在于数据库,即excel中数据是否有效,若有效则将excel表中的中文字段转换为数据库对应的英文字段 /// </summary> /// <param name="DataTable">数据库中数据表的字段与描述的对应表</param> /// <param name="dtExcel">excel数据表</param> /// <returns></returns> public DataTable ExcelCompareSQL(DataTable dtNameMapping, DataTable dtExcel) { bool isContain = true; foreach (DataColumn dc in dtExcel.Columns) { DataRow[] drName = dtNameMapping.Select(string.Format("value='{0}'", dc.ColumnName.Trim().Replace("'",""))); if (drName.Length == 1) { dc.ColumnName = drName[0]["objname"].ToString(); dtExcel.AcceptChanges(); } else { isContain = false; break; } } if (!isContain) { throw new Exception("Excel表中的某些列无效。"); } return dtExcel; }
问题:在这个步骤中会遇到问题:
DataRow[] drName = dtNameMapping.Select(string.Format("value='{0}'", dc.ColumnName.Trim().Replace("'","")));
如果获取对应表DtNameMapping时没有将数据字段进行类型转换直接写
SELECT objname , valueFROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', 'ProjectEntity', 'column', default)
因为value的数据类型是 sql_variant,所以在代码中用dt.select ("value='{0}'")是不起作用的,甚至跟踪时监视dt里的value也是不能选中的,类似以只有读的权限,没有增删改查的权限,将其转换类型,即可解决该问题
备注:
修改或增加字段的说明扩展属性,第一条为修改,第二天为增加
EXEC sp_updateextendedproperty 'MS_Description',N'项目业主','user',dbo,'table','ProjectEntity','column','CustomerName'EXEC sp_addextendedproperty 'MS_Description',N'备注','user',dbo,'table','ProjectEntity','column','Memo'
- Excel导入数据库过程中遇到的问题
- 将EXCEL用存储过程导入数据库表(SQL SERVER)遇到的问题
- 导入EXCEL遇到的问题
- 数据库使用过程中遇到的问题
- 数据库导入遇到的问题
- VS编辑Excel过程中遇到的问题和记录
- EXCEL导入SQL数据库中应注意的问题
- Excel导入数据库的存储过程
- 从excel表导入数据到sql server 2005数据库遇到的问题
- 安装db2 数据库过程中遇到的安装失败问题
- magento 导入数据库时遇到的问题
- Navicat、SQLyog导入数据库遇到的问题
- POI导入2007EXCEL中遇到的文件描述符错误的问题
- POI导入2007EXCEL中遇到的文件描述符错误的问题
- excel表导入oracle数据库的问题
- PHP word,excel导入数据库的问题
- excel导入数据库的一点小问题
- 关于mysql数据库导入excel的问题
- HRBEU/HEUOJ----1002 A Star not a Tree?
- VS2008 stack overflow
- 屏蔽siverlight的右键
- poj 1316 Self Numbers
- memcpy 和 memmove 的区别,memcpy 和 strcpy 的区别
- Excel导入数据库过程中遇到的问题
- 5_28_天天向上
- 5_29_天天向上
- 我的第一个板子--8个LED灯轮回显示
- Android 中组件的显示与隐藏
- javascript:void(0);
- 经典算法研究:模式匹配(子串匹配)之 BM 算法(C语言实现版)初版
- 5_30_天天向上
- ABAP Screen的常用语句(再多年的ABAP参数都不可能全都记住的)