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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 阿里java高级工程师面试100题「建议收藏」

    阿里java高级工程师面试100题「建议收藏」大型网站架构技术QQ群:3686148491,java堆,分新生代老年代,新生代有Eden,fromsurviver,tosurviver三个空间,堆被所有线程共。eden内存不足时,发生一次minorGC,会把fromsurvivor和eden的对象复制到tosurvivor,这次的to survivor就变成了下次的fromsurvivor,经过多次minorGC,默认15次…

    2022年6月9日
    59
  • 背单词的方法

    背单词的方法

    2021年5月2日
    121
  • ES6—new Promise()讲解,Promise对象是用来干嘛的?应该怎么用?使用场景有哪些?

    ES6—new Promise()讲解,Promise对象是用来干嘛的?应该怎么用?使用场景有哪些?ES6Promise先拉出来遛遛复杂的概念先不讲,我们先简单粗暴地把Promise用一下,有个直观感受。那么第一个问题来了,Promise是什么玩意呢?是一个类?对象?数组?函数?别猜了,直接打印出来看看吧,console.dir(Promise),就这么简单粗暴。这么一看就明白了,Promise是…

    2022年4月30日
    88
  • c语言xml解析器libxm2

    c语言xml解析器libxm2写这篇文章的原因有如下几点:1)C++标准库中没有操作XML的方法,用C++操作XML文件必须熟悉一种函数库,LIBXML2是其中一种很优秀的XML库,而且它同时支持多种编程语言;2)LIBXML2库的Tutorial写得不太好,尤其是编码转换的部分,不适用于中文编码的转换;3)网上的大多数关于Libxml2的介绍仅仅是翻译了自带的资料,没有详细介绍如何在windows平台下进行编程,更很少提到如

    2022年7月12日
    55
  • 织梦dedeCMS留言薄

    织梦dedeCMS留言薄

    2021年9月24日
    42
  • Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)「建议收藏」

    Mac录屏同时录制系统声音和画外音(Soundflower无法安装解决方案)「建议收藏」个人博客地址:xzajyjs.cn前言以前一直有录屏的需求,但苦于自带的QuickTime无法录制内屏声音,一直使用的是第三方的app。近期开腾讯会议需要录屏,但主持人本身没有开启录屏权限,只好通过我本机端进行录制。然后我使用的第三方app虽然能录制系统声音,但无法录制腾讯会议的声音,录了一个半小时竟然是哑剧!一怒之下删掉了原来的那个app,重新探寻QuickTime录屏之路。网上一番寻找,很多教程都说要安装Soundflower这个音频插件,但在他们的github逛了一圈后发现这个插件早就停止维

    2022年6月9日
    62

发表回复

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

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