DataTable里有一张表tableA
tableA 有三列A,C,E
目标数据库里有一张表tableB
tableB 有五列A,B,C,D,E
我现在要把tableA的A,C,E 入到 tableB的A,C,E中
            string errMsg = string.Empty;
            DataTable dt = tableA;
                      
                using (SqlBulkCopy desBulk = new SqlBulkCopy(connstr, SqlBulkCopyOptions.UseInternalTransaction) 
                { BulkCopyTimeout = 500000000, NotifyAfter = dt.Rows.Count })
                {
                    try
                    {
                        desBulk.DestinationTableName = "tableB";
                        
                        foreach (DataColumn dc in dt.Columns)
                        {
                            desBulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
                        }
                        desBulk.WriteToServer(dt); 
                    }
                    catch (Exception ex)
                    {
                        errMsg = ex.Message;
                    }
                }
            }结果报错给定的ColumnMappings与源或目标中的任意列均不匹配.
请问这个该如何改?谢谢

解决方案 »

  1.   

    如果无法一致。则只能使用笨办法了。select .. insert into 
      

  2.   

    你看下代码呀
         foreach (DataColumn dc in dt.Columns)
         {
             desBulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
         }
    这里已经让列名一致了
      

  3.   

    你的这个需要2个表的列名判断比较一下吧
    foreach (DataColumn dc in dt.Columns)
    {
          foreach (DataColumn dc2 in desBulk.Columns)
          {
               if(dc.ColumnName==dc2.ColumnName)
               {
                      desBulk.ColumnMappings.Add(dc.ColumnName, dc.ColumnName);
               }
         }
    }
      

  4.   

    = = 都是一样的,tableA 和 tableB 的列名一样,就是tableB比tableA多了几列
      

  5.   

    tableA和tableB的列没有对应好  /// <summary> 
        /// 将DataTable中数据批量数据库表中
        /// <param name="dt">源数据集</param>  
        /// <param name="ExcelTitle">DataTable数据题头</param>  
        /// <param name="DBColumnName">要插入数据的表的对应字段</param>   
        /// <param name="DestinationTableName">写入数据的数据库表名</param>  
        /// </summary>  
        public static void SqlBulkCopyData(System.Data.DataTable dt, string[] DataTableTitle, string[] DBColumnName, string DestinationTableName)
        {
            SqlConnection conn = new SqlConnection("…………………………");
            //初始化连接字符串  
            if (conn.State == ConnectionState.Closed)
            {
                conn.Open();
            }
            SqlBulkCopy bcp = new SqlBulkCopy(conn);
            //指定目标数据库表名
            bcp.DestinationTableName = DestinationTableName;
            //指定源列和目标列之间的对应关系
            for (int i = 0; i < DataTableTitle.Length; i++)
            {
                bcp.ColumnMappings.Add(DataTableTitle[i], DBColumnName[i]);
            }
            //写入数据库表 
            bcp.WriteToServer(dt);
            bcp.Close();
            conn.Close();
        }  
      

  6.   


    是啊,所以找出列名相同的,排除列名不同的,要不然会报列名不匹配的,虽然你的这个A->B不是,但是B->A就会出现这样的问题啊。
      

  7.   

    测试了通过了,是有个目标数据有个列名有个字母是大写,改成和源一样再用taomanman的方法就通过了,
    奇怪我记得不区分大小写的呀
      

  8.   

    学习了,oracle方面批量入库倒是有一些经验,一秒可以插入2000条记录。