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转换成跟数据库中对应的,

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

时间: 2024-11-03 21:08:27

SqlBulkCopy 批量导入数据 转换表字段类型的相关文章

django 批量导入数据

一.需求 我在数据库中建了一张表,用来保存ucloud云上的project id 和project name models.py代码如下 #coding:utf-8 from django.db import models class Project(models.Model):     name = models.CharField(u'项目名称',max_length=32,blank=True)     id = models.CharField(u'项目ID',max_length=32

利用OLEDB+SqlClient实现EXCEL批量导入数据

以下是几个自己写的类 /// <summary> /// 取得Excel对象 /// </summary> /// <param name="strConn">OLEDB连接字符串</param> /// <param name="sql">SQL语句</param> /// <returns></returns> public static DataTable GetE

MySQL建表字段类型

1.数据库:在MySQL中,要存储数据,必须从数据库开始,因此首先要创建数据库,但由于学校的MySQL服务器对学生数据帐号有限止,学生不得创建数据库,故每个学生的帐号中已事先由信息中心为大家建立了一个名为帐号名的数据库.但我们必须了解创建数据库的语句为CREATE DATABASE <数据库名>2.数据表:是构成数据库的一个基本单位,在一个数据库中用户可以建立多张数据表.这是我们有权力建立的.3.数据表结构:创建一个数据表的第一步即为创建数据表结构,在数据表结构中的内容包括:有几个字段,每个字

Excel批量导入数据之数据校验

最近,工作上接到Excel批量导入数据的需求.在这里,小编想分享的是数据校验那些事,至于如何读取Excel数据,大家可以百度下. 一般而言,Excel批量导入数据,我们都会给客户提供一个固定的模板以输入我们期望的数据.然而,客户的操作,我们是无法预料的,他们有可能增加一列或者删除一列,有可能去掉Excel某个字段的输入限制等等. Excel模板,有可能只有一个,有可能若干个.各个模板的数据列,或交叉相同,或存在个性化列. 同一个模板,也许因某列数据的不同,而需要填充不同数据列. ...... 面

Dynamics 2015 数据管理 之 如何批量导入数据到 正式区(一)

单一个项目的数据导入可以在具体功能 中导入,大体位置如下. 如果项目新上线的话,要批量导入数据的话,就要到如下的功能中实现了. 进入方式: 在 设置 ---- 数据管理 下载 下载后,用EXCEL打开, 给业务人员批量输入数据. 编辑好以后,上传吧,点 导入. 下一步即可以,导入以后,可以返回看看数据导入的情况,格式有没有错误等.

修改非空表字段类型Oracle

执行以下语句报"要修改数据类型,则要更改的列必须为空"       alter table 表名 modify (目标字段 varchar2(100)); 解决步骤: 第一步,在表中加一个临时字段       alter table 表名 add 临时字段 目标字段原来的类型; 第二步,将目标字段的值付给临时字段,并将目标字段置空       update 表名 set 临时字段=目标字段,目标字段=null; 第三步,修改目标类型       alter table 表名  modi

Excel2007数据透视表字段设置按钮为灰色

作者:iamlaosong 刚从Excel2003转到Excel2007,菜单不太熟悉,一个功能往往要找半天,做数据透视表自然也会碰到一些问题,这里说说字段设置时碰到的一个问题.Excel2007数据透视表字段设置可以设置对数据字段的处理方式,包括求和.计数.平均值.最大值.最小值.乘积.数值计算.标准偏差.总体标准偏差.方差和总体方差.字段设置网上有很多文章描述,这里就不多说了. 我在做字段设置时,发现"字段设置"按钮为灰色,点击不起作用,折腾半天才发现,设置字段时如果是左边字段(行

asp.net线程批量导入数据时通过ajax获取执行状态

最近因为工作中遇到一个需求,需要做了一个批量导入功能,但长时间运行没个反馈状态,很容易让人看了心急,产生各种臆想!为了解决心里障碍,写了这么个功能. 通过线程执行导入,并把正在执行的状态存入session,既共享执行状态,通过ajax调用session里的执行状态,从而实现反馈导入状态的功能! 上代码: 前端页面 <!DOCTYPE html> <html lang="en"> <head>  <meta charset="UTF-8

C#中的SqlBulkCopy批量插入数据

在C#中,我们可以使用sqlBulkCopy去批量插入数据,其他批量插入方法不在讨论. 1 /// <summary> 2 /// SqlBulkCopy批量插入数据 3 /// </summary> 4 /// <param name="connectionStr">链接字符串</param> 5 /// <param name="dataTableName">表名</param> 6 ///