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并发——线程同步Volatile与Synchronized详解

    Java并发——线程同步Volatile与Synchronized详解Java面试——线程同步volatile与synchronized详解0.前言面试时很可能遇到这样一个问题:使用volatile修饰int型变量i,多个线程同时进行i++操作,这样可以实现线程安全吗?提到线程安全、线程同步,我们经常会想到两个关键字:volatile和synchronized,那么这两者有什么区别呢?1.volatile与synchronized介绍volatile是变量修

    2022年7月11日
    16
  • mybatis-plus超详细讲解[通俗易懂]

    mybatis-plus超详细讲解[通俗易懂]mybatis-puls超详细讲解本文笔记都是观看狂神老师视频手敲的,敲完的时候发现一件挺奔溃的事,视频地址:https://www.bilibili.com/video/BV17E411N7KN视频地址这个老师讲课真的很好,学java后端的都可以去看一下,从基础到架构很详细,推荐给大家https://space.bilibili.com/95256449/狂神说最近做项目听到老师讲到使用…

    2022年5月5日
    41
  • ubuntu18.04超级简单的安装wine QQ教程

    第一步打开UbuntuSoftware,搜索wine第二步下载wine和Winetricks,并打开Winetricks(如图)ps:有可能会跳出一些提示框,直接点ok第三步选择安装一个windows应用,并选择qq安装ps:会下载安装包以及一些插件,可能不能一次成功,再进行一次相同的操作即可第四步安装QQ完成ps:这个Win…

    2022年4月6日
    259
  • JAVA Applet小应用程序入门

    JAVA Applet小应用程序入门1.Applet如何运行不同于java应用程序,运行applet需要在对应html文件通过&lt;applet&gt;指定applet程序名,即可在浏览器中运行.2.Applet如何编写我的工具是eclipse。新建一个类该类必须是public且继承Applet。文件名与类名一样3.Applet类中方法的执行顺序与生命周期先执行构造方法 再执行init()进行一些数…

    2022年7月8日
    21
  • plsql激活码/注册码 PL/SQL Developer激活码注册码全版本永久激活

    plsql激活码/注册码 PL/SQL Developer激活码注册码全版本永久激活注册码:ProductCode(产品代号):4t46t6vydkvsxekkvf3fjnpzy5wbuhphqzserialNumber(序列号):601769password(密码):xs374ca

    2022年7月14日
    592
  • c语言生成随机数数组

    c语言实现获得从0~num-1的随机数组(数组元素不重复,内容是0~num-1),实现的原理是数组乱序,效率高!

    2022年4月7日
    52

发表回复

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

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