SqlBulkCopy 批量导入数据 转换表字段类型

在使用SqlBulkCopy导入数据时,要有一个跟数据库里面同样的DataTable

要赋值表名

要求每个列跟数据库中列同名,并且列的类型要赋值跟数据库中列的类型对应的NET类型

要求数据库中为Null的数据,赋值DBNull.Value

代码:

        [AcceptVerbs(HttpVerbs.Post)]
        public JsonResult Upload(HttpPostedFileBase fileData)
        {
            if (fileData != null)
            {
                try
                {
                    Guid UserID = (Session["User"] as User).UserID;
                    List<string> columns = GetColumns();
                    string fileName = Path.GetFileName(fileData.FileName);// 原始文件名称
                    string fileExtension = Path.GetExtension(fileName); // 文件扩展名
                    DataTable dt = new DataTable();

                    IWorkbook workbook = null;
                    if (fileExtension == ".xlsx")
                    {
                        workbook = new XSSFWorkbook(fileData.InputStream); // .xlsx
                    }
                    else
                    {
                        workbook = new HSSFWorkbook(fileData.InputStream); // .xls
                    }

                    ISheet sheet = workbook.GetSheetAt(0);
                    System.Collections.IEnumerator rows = sheet.GetRowEnumerator();
                    int cellCount = columns.Count();
                    foreach (var col in columns)
                    {
                        dt.Columns.Add(col.Trim());
                    }
                    //用于跳出2层循环
                    var isT = false;
                    for (int i = (sheet.FirstRowNum + 3); i <= sheet.LastRowNum; i++)
                    {
                        if (isT) { break; }
                        IRow row = sheet.GetRow(i);
                        DataRow dataRow = dt.NewRow();
                        for (int j = row.FirstCellNum; j < cellCount; j++)
                        {
                            if (j == 0)
                            {
                                string num = row.GetCell(j).ToString();
                                if (string.IsNullOrEmpty(row.GetCell(j).ToString()))
                                {
                                    isT = true; break;
                                }
                                if (row.GetCell(j) != null)
                                    dataRow[j] = Guid.NewGuid();

                            }
                            else
                            {
                                if (row.GetCell(j) != null)
                                    dataRow[j] = row.GetCell(j).ToString();
                            }
                        }
                        if (!isT)
                        {
                            dt.Rows.Add(dataRow);
                        }
                    }
                    dt.Columns.Remove("合计");
                    dt.Columns.Add("InsuranceCompany");
                    dt.Columns.Add("IsDelete");
                    dt.Columns.Add("CreateTime");
                    dt.Columns.Add("CreateBy");
                    dt.Columns.Add("UpdateTime");
                    dt.Columns.Add("UpdateBy");
                    for (var i = 0; i < dt.Rows.Count; i++)
                    {
                        DataRow dr = dt.Rows[i];
                        dr["IsDelete"] = false;
                        dr["CreateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        dr["CreateBy"] = UserID;
                        dr["UpdateTime"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
                        dr["UpdateBy"] = UserID;
                        string state = dr["State"].ToString().Trim();
                        if (state == "在修")
                        {
                            dr["State"] = 1;
                        }
                        else
                        {
                            //已结算
                            dr["State"] = 2;
                        }
                        string InsuranceCompany = "";
                        string str1 = dr["中保"].ToString().Trim();
                        string str2 = dr["太保"].ToString().Trim();
                        string str3 = dr["平安"].ToString().Trim();
                        string str4 = dr["其他"].ToString().Trim();
                        if (!string.IsNullOrEmpty(str1))
                        {
                            InsuranceCompany = "中保";
                        }
                        else if (!string.IsNullOrEmpty(str2))
                        {
                            InsuranceCompany = "太保";
                        }
                        else if (!string.IsNullOrEmpty(str3))
                        {
                            InsuranceCompany = "平安";
                        }
                        else if (!string.IsNullOrEmpty(str4))
                        {
                            InsuranceCompany = "其他";
                        }
                        dr["InsuranceCompany"] = InsuranceCompany;
                    }
                    dt.Columns.Remove("中保");
                    dt.Columns.Remove("太保");
                    dt.Columns.Remove("平安");
                    dt.Columns.Remove("其他");
                    dt.TableName = "T_DMSMaintenance";
                    DataTable dt2 = ConvertDataType(dt);
                    BizCenter biz = new BizCenter();
                    var isS = biz.SqlBulkCopyData(dt2, "ID", "CJGreenWay");
                    if (isS)
                    {
                        return Json(new { Success = true, Message = "导入数据成功!" }, JsonRequestBehavior.AllowGet);
                    }
                    else
                    {
                        return Json(new { Success = false, Message = "导入数据失败!" }, JsonRequestBehavior.AllowGet);
                    }
                }
                catch (Exception ex)
                {
                    return Json(new { Success = false, Message = ex.Message }, JsonRequestBehavior.AllowGet);
                }
            }
            else
            {
                return Json(new { Success = false, Message = "请选择要上传的文件!" }, JsonRequestBehavior.AllowGet);
            }
        }

        public DataTable ConvertDataType(DataTable dt)
        {
            var conn = new SqlConnection(ConnectionInstance.Instance.ConnectionNodes["CJGreenWay"].connectionString);
            conn.Open();
            if (dt.Rows.Count == 0) return null;
            DataTable result = new DataTable();
            //获取数据库表结构
            var res = new string[4];
            res[2] = dt.TableName;
            DataTable dtTemp = conn.GetSchema("Columns", res);
            foreach (DataRow row in dtTemp.Rows)
            {
                string colName = row["COLUMN_NAME"].ToString();
                string dataType = row["DATA_TYPE"].ToString();
                bool isNull = row["IS_NULLABLE"].ToString().Trim() == "YES" ? true : false;
                foreach (DataColumn dc in dt.Columns)
                {
                    if (dc.ColumnName == colName)
                    {
                        result.Columns.Add(colName, GetCSharpType(dataType));
                    }
                }
            }
            foreach (DataRow row in dt.Rows)
            {
                DataRow nRow = result.NewRow();
                foreach (DataColumn col in dt.Columns)
                {
                    if (string.IsNullOrEmpty(row[col.ColumnName].ToString()))
                    {
                        nRow[col.ColumnName] = DBNull.Value;
                    }
                    else
                    {
                       nRow[col.ColumnName] = row[col.ColumnName];
                    }
                }
                result.Rows.Add(nRow);
            }
            result.TableName = dt.TableName;
            conn.Close();
            return result;
        }
        public List<string> GetColumns()
        {

            string arr = @"   ID    ,State
            ,WorkOrderNO
      ,CustomerName
      ,CarNo
      ,ServiceAdvisor
      ,ElectricalLaborHour
      ,ElectricalParts
      ,SheetSprayLaborHour
      ,SheetSprayParts
      ,SheetSprayPayType
      ,SheetSprayTransLaborHour
      ,OilChangeLaborHour
      ,OilChangeParts
      ,WarrantyLaborHour
      ,WarrantyParts
      ,WarrantyTransLaborHour
      ,InternalElectricalLaborHour
      ,InternalParts
      ,InternalSheetSprayLaborHour
      ,InternalOil
      ,InternalPayDept
      ,ZeroWorkOrder
      ,合计 
      ,中保
 ,太保
 ,平安
 ,其他";
            return arr.Replace("\r\n", "").Replace (" ","").Split(',').ToList();
        }

        public Type GetCSharpType(string type, bool isNull = false)
        {
            Type tp;
            switch (type.ToLower())
            {
                case "uniqueidentifier":
                    if (isNull) { tp = typeof(Guid?); } else { tp = typeof(Guid); } break;
                case "nvarchar":
                case "varchar":
                case "nchar":
                case "text":
                    tp = typeof(string); break;
                case "bit":
                    if (isNull) { tp = typeof(bool?); } else { tp = typeof(bool); } break;
                case "datetime":
                case "timestamp":
                    if (isNull) { tp = typeof(DateTime?); } else { tp = typeof(DateTime); } break;
                case "tinyint":
                case "int":
                case "bigint":
                case "float":
                case "decimal":
                case "numeric":
                    if (isNull) { tp = typeof(decimal?); } else { tp = typeof(decimal); } break;
                default:
                    tp = typeof(string); break;

            }
            return tp;
        }

 

先是导入Excel中数据,然后将Excel生成的DataTable转换成跟数据库中对应的,

使用新的表,因为有数据的表的列不能转换列的类型

conn.GetSchema("Columns", res); 获取表字段信息


查看具体的ConvertDataType方法,就是具体的给表的列赋值类型
表的类型不需要转换成C#中带null的类型,比如DateTime不需要让表的字段类型转成DateTime?,有null直接赋值DBNull.Value;
posted @ 2015-09-17 10:57  hongdada  阅读(1760)  评论(0编辑  收藏  举报