SqlBulkCopy – The given value of type String from the data source cannot be converted to type

SqlBulkCopy – The given value of type String from the data source cannot be converted to typeSqlBulkCopy-ThegivenvalueoftypeStringfromthedatasourcecannotbeconvertedtotypeofthespecifiedtargetcolumn针对使用C#SqlBulkCopy对象遇到的问题总结1.批量插入excel数据遇到的类型转换问题2.去除非数据行以下是对应的解决办法及代码1….

大家好,又见面了,我是你们的朋友全栈君。

SqlBulkCopy – The given value of type String from the data source cannot be converted to type of the specified target column

针对使用C#SqlBulkCopy对象遇到的问题总结
1.批量插入excel数据遇到的类型转换问题
2.去除非数据行

以下是对应的解决办法及代码
1.批量插入数据报错两种可能,第一填写字段对应关系的时候可能有重复的,第二是数据的字段长度不足(这个需要注释一些字段然后慢慢放开注释找到出错的字段)
2.第二个直接上代码
注:ColumnMapping 是自己手动创建的excel列名与数据库对应表的列名一一对应的类

/// <summary>
        /// 
        /// </summary>
        /// <param name="P_str_Excel">excel file name</param>
        /// <param name="P_str_SheetName"></param>       
        public void ImportDataToSql(string P_str_Excel, string DestinationTableName, ColumnMappingCollection collectionMapping, bool ifClearContent = false)
        {
            //DataSet myds = new DataSet();                               //创建数据集对象
            try
            {
                string P_str_SheetName = GetSheetName(P_str_Excel)[0];
                //获得全部数据
                string P_str_OledbCon;
                if (Environment.Is64BitOperatingSystem == false)
                    P_str_OledbCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
                else
                    P_str_OledbCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + P_str_Excel + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
                OleDbConnection oledbcon = new OleDbConnection(P_str_OledbCon);     //创建Oledb数据库连接对象
                string P_str_ExcelSql;                             //记录要执行的Excel查询语句
                OleDbDataAdapter oledbda = null;                            //创建Oledb数据桥接器对象
                P_str_ExcelSql = string.Format("select * from [{0}$]", P_str_SheetName);    //记录要执行的Excel查询语句
                oledbda = new OleDbDataAdapter(P_str_ExcelSql, P_str_OledbCon);     //使用数据桥接器执行Excel查询

                DataTable importedTable = new DataTable();
                importedTable.Columns.Clear();

                oledbda.Fill(importedTable);                            //填充数据

                if (ifClearContent)
                {
                    //清楚非内容行
                    ColumnMapping firstColumn = collectionMapping.FindbyFileIndex(0);
                    List<DataRow> deleteList = new List<DataRow>();
                    foreach (DataRow item in importedTable.Rows)
                    {
                        if (item[0].ToString() != firstColumn.FileFieldName)
                            item.Delete();
                        else
                            break;
                    }

                    int i = 0;
                    foreach (var item in collectionMapping)
                    {
                        importedTable.Columns[i].Caption = item.FileFieldName;
                        importedTable.Columns[i].ColumnName = item.FileFieldName;
                        i++;
                    }

                    importedTable.AcceptChanges();
                    oledbda.Update(importedTable);
                }

                using (SqlBulkCopy bcp = new SqlBulkCopy(ConnectString))         //用bcp导入数据
                {
                    bcp.BatchSize = 100;                                //每次传输的行数
                    bcp.DestinationTableName = DestinationTableName;             //定义目标表
                    foreach (var item in collectionMapping)
                    {
                        bcp.ColumnMappings.Add(item.FileFieldName, item.DataColumnName);
                    }
                    
                    bcp.WriteToServer(importedTable);                      //将数据写入Sql Server数据表
                }
            }
            catch(Exception ex)
            {
                throw ex;
            }
        }

        private List<string> GetSheetName(string P_str_Excel)                           //获取所有工作表名称
        {
            List<string> P_list_SheetName = new List<string>();                     //创建泛型集合对象
            string P_str_OledbCon;
            if (Environment.Is64BitOperatingSystem == false)
                P_str_OledbCon = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + P_str_Excel + ";Extended Properties=\"Excel 8.0;HDR=Yes;IMEX=2\"";
            else
                P_str_OledbCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + P_str_Excel + ";Extended Properties=\"Excel 12.0;HDR=Yes;IMEX=2\"";
            OleDbConnection olecon = new OleDbConnection(P_str_OledbCon);                                         //连接Excel数据库
            olecon.Open();                                              //打开数据库连接
            System.Data.DataTable DTable = olecon.GetSchema("Tables");                  //创建表对象
            DataTableReader DTReader = new DataTableReader(DTable);                 //创建表读取对象
            while (DTReader.Read())                                     //循环读取
            {
                string P_str_Name = DTReader["Table_Name"].ToString().Replace('$', ' ').Trim(); //记录工作表名称
                if (!P_list_SheetName.Contains(P_str_Name))                     //判断泛型集合中是否已经存在该工作表名称
                    P_list_SheetName.Add(P_str_Name);                           //将工作表名添加到泛型集合中
            }
            DTable = null;                                              //清空表对象
            DTReader = null;                                            //清空表读取对象
            olecon.Close();                                             //关闭数据库连接
            return P_list_SheetName;                                        //返回得到的泛型集合
        }
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/162226.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 逻辑漏洞概述[通俗易懂]

    逻辑漏洞概述[通俗易懂]访问:主体与客体之间的信息流动。主动的是主体,被动的是客体。主体访问客体的四个步骤:身份标识-&amp;gt;身份验证(数据库匹配信息,判断身份是否合法)-&amp;gt;授权(判断身份是谁,管理员或正常账户)-&amp;gt;审计(记录操作)访问控制模型:自主访问控住(DAC大部分使用):由客体的属主自主对客体进行管理,自主决定是否将访问权限授予其他主体。强制访问控制(MAC军方或重要政府部门用):安全…

    2022年4月28日
    47
  • JSON转String转JSONArray-猿气满满-CSDN博客「建议收藏」

    JSON转String转JSONArray-猿气满满-CSDN博客「建议收藏」String转JSONStringjsonStr="{status:200,massage:0,result:{id:0987,name:"csdn"}}";//转jsonJSONObjectjson=JSONObject.fromObject(jsonStr);JSON转JSONArrayJSONObjectjson=JSONObject.fromObject…

    2022年6月20日
    184
  • android 自定义控件 attrs,android 使用attrs自定义控件

    android 自定义控件 attrs,android 使用attrs自定义控件步骤:1、在values下新建一个attrs.xml的资源文件(my_attrs.xml)//===》name为引用资源的名称//attr中的name为自定义的名称format为类型//字体颜色//字体大小//字符串2、新建一个类MyAttrsMyView继承View覆写publicMyAttrsMyView(Contextcontext,Attribu…

    2022年10月17日
    0
  • java8新特性(拉姆达表达式lambda)

    java8新特性(拉姆达表达式lambda)一、函数式接口函数式接口(functionalinterface也叫功能性接口,其实是同一个东西)。简单来说,函数式接口是只包含一个方法的接口。比如Java标准库中的java.lang.Runnable和java.util.Comparator都是典型的函数式接口。java8提供@FunctionalInterface作为注解,这个注解是非必须的,只要接口符合函数式接口的标准

    2022年9月19日
    2
  • Jwt生成和解析工具类(万用版,可作为数据存储容器来传输)

    Jwt生成和解析工具类(万用版,可作为数据存储容器来传输)packagecom.ciih.authcenter.client.util.jwt;importcom.alibaba.fastjson.JSON;importcom.auth0.jwt.JWT;importcom.auth0.jwt.JWTCreator;importcom.auth0.jwt.JWTVerifier;importcom.auth0.jwt.algorithms.Algorithm;importcom.auth0.jwt.interfaces.Claim;.

    2022年6月15日
    113
  • pycharm flask框架_挣钱的项目

    pycharm flask框架_挣钱的项目基于Pycharm轻松创建Flask项目需要pycharm专业版,社区版是没有项目模板的,也可以手动创建这几个文件夹完成模板的创建。打开Pycharm的file,选择创建新的项目,然后弹出对话框,我们可以看到里面有很多的案例,Flask、Django等等,我们选择生成Flask的demo程序选择创建之后一个简易的Flask项目就出现在我们眼前,第一个是入口程序,还有一个static的静态目录,templates是模板存放的位置我们可以手动来启动这个Flask项目,但是这不是很理智的,在Pych

    2022年8月28日
    4

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号