给定的 ColumnMapping 与源或目标中的任意列均不匹配 与 从bcp 客户端收到的列长度无效 从excel导入SqlServer

在尝试使用System.Data.SqlClient.SqlBulkCopy将Excel数据导入SQLServer时,遇到了'给定的 ColumnMapping 与源或目标中的任意列均不匹配'和'从bcp 客户端收到的列长度无效'的错误。解决方案是确保ColumnMappings正确映射,并调整目标表的字段长度以适应源数据。通过修改创建表的SQL语句,将字段类型和长度设置为适合Excel数据的格式,成功解决了问题。

今日在导入Excel后要生成一张表,将Excel表内容转化为数据库中表内容时使用到System.Data.SqlClient.SqlBulkCopy这个类的对象,其中有个ColumnMapping.Add的对象方法,view plaincopy to clipboardprint?
  /***** Excel导入 *****/ 
    private void PapperImport(string name)  
    {  
       string Tablename = name.Remove(name.IndexOf("."));  
       Tablename = Tablename.Substring(name.LastIndexOf("//") + 1);  
       string sql = "select ObjectProperty(Object_ID( '" + Tablename + "'),'IsUserTable')"; //判断是否存在某张表的sql语句。  
         if (new DataBase().GetDataSetSql(sql).Tables[0].Rows[0][0].ToString() == "")  
         {  
             //创建Excel连接  
             //连接字符串  
             string strConn = "Provider =Microsoft.Jet.OLEDB.4.0; Data Source = " + name + "; Extended Properties='Excel 8.0; HDR = YES';";  
             OleDbConnection conn = new OleDbConnection(strConn);  
             conn.Open();  
             string strExcel = "";  
             OleDbDataAdapter myCommand = null;  
             strExcel = "select * from [Sheet1$]";  
             myCommand = new OleDbDataAdapter(strExcel, strConn);  
             DataTable dt = new DataTable();  
             myCommand.Fill(dt);  
             conn.Close();  
             //===导入到datatable完毕========================  
             //========生成数据库表==========  
             sql = "use MyOnlineExam   create table " + Tablename + "(题号 int primary Key, 题干 varchar(500), A varchar(500), B varchar(500), C varchar(500), D varchar(500), 学生选择答案 char(2),正确答案 char(2), 学号 varchar(14) )";  
             new DataBase().ExecuteNonQuery(sql);  
             //=========往数据库表中添加数据================  
             System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(System.Configuration.ConfigurationManager.AppSettings["constr"]);  
             sqlbulk.DestinationTableName = Tablename;  
             try 
             {  
                 sqlbulk.ColumnMappings.Add("题号", "题号");  
                 sqlbulk.ColumnMappings.Add("题干", "题干");  
                 sqlbulk.ColumnMappings.Add("A", "A");  
                 sqlbulk.ColumnMappings.Add("B", "B");  
                 sqlbulk.ColumnMappings.Add("C", "C");  
                 sqlbulk.ColumnMappings.Add("D", "D");  
                 sqlbulk.ColumnMappings.Add("学生选择答案", "学生选择答案");  
                 sqlbulk.ColumnMappings.Add("正确答案", "正确答案");  
                 sqlbulk.ColumnMappings.Add("学号", "学号");  
                 sqlbulk.WriteToServer(dt);  
                 sqlbulk.Close();  
             }  
             catch (Exception ex)  
             {  
                 Response.Write("<mce:script type="text/javascript"><!--  
 alert('" + ex.Message + "')   
// --></mce:script>");  
                 sql = "use MyOnlineExam  drop table " + Tablename;  
                 new DataBase().ExecuteNonQuery(sql);  
                 return;  
             }             
             Response.Write("<mce:script type="text/javascript"><!--  
 alert('该学期所有试卷已经成功导入到系统,您可以输入学号进行查询!')   
// --></mce:script>");  
         }  
         else 
         {  
             Response.Write("<mce:script type="text/javascript"><!--  
 alert('系统中已经存在该套试卷,您可以直接输入学号进行查询!')  
// --></mce:script>");  
         }  
        return;  
    } 
  /***** Excel导入 *****/
    private void PapperImport(string name)
    {
       string Tablename = name.Remove(name.IndexOf("."));
       Tablename = Tablename.Substring(name.LastIndexOf("//") + 1);
       string sql = "select ObjectProperty(Object_ID( '" + Tablename + "'),'IsUserTable')"; //判断是否存在某张表的sql语句。
         if (new DataBase().GetDataSetSql(sql).Tables[0].Rows[0][0].ToString() == "")
         {
             //创建Excel连接
             //连接字符串
             string strConn = "Provider =Microsoft.Jet.OLEDB.4.0; Data Source = " + name + "; Extended Properties='Excel 8.0; HDR = YES';";
             OleDbConnection conn = new OleDbConnection(strConn);
             conn.Open();
             string strExcel = "";
             OleDbDataAdapter myCommand = null;
             strExcel = "select * from [Sheet1$]";
             myCommand = new OleDbDataAdapter(strExcel, strConn);
             DataTable dt = new DataTable();
             myCommand.Fill(dt);
             conn.Close();
             //===导入到datatable完毕========================
             //========生成数据库表==========
             sql = "use MyOnlineExam   create table " + Tablename + "(题号 int primary Key, 题干 varchar(500), A varchar(500), B varchar(500), C varchar(500), D varchar(500), 学生选择答案 char(2),正确答案 char(2), 学号 varchar(14) )";
             new DataBase().ExecuteNonQuery(sql);
             //=========往数据库表中添加数据================
             System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(System.Configuration.ConfigurationManager.AppSettings["constr"]);
             sqlbulk.DestinationTableName = Tablename;
             try
             {
                 sqlbulk.ColumnMappings.Add("题号", "题号");
                 sqlbulk.ColumnMappings.Add("题干", "题干");
                 sqlbulk.ColumnMappings.Add("A", "A");
                 sqlbulk.ColumnMappings.Add("B", "B");
                 sqlbulk.ColumnMappings.Add("C", "C");
                 sqlbulk.ColumnMappings.Add("D", "D");
                 sqlbulk.ColumnMappings.Add("学生选择答案", "学生选择答案");
                 sqlbulk.ColumnMappings.Add("正确答案", "正确答案");
                 sqlbulk.ColumnMappings.Add("学号", "学号");
                 sqlbulk.WriteToServer(dt);
                 sqlbulk.Close();
             }
             catch (Exception ex)
             {
                 Response.Write("<mce:script type="text/javascript"><!--
 alert('" + ex.Message + "')
// --></mce:script>");
                 sql = "use MyOnlineExam  drop table " + Tablename;
                 new DataBase().ExecuteNonQuery(sql);
                 return;
             }          
             Response.Write("<mce:script type="text/javascript"><!--
 alert('该学期所有试卷已经成功导入到系统,您可以输入学号进行查询!')
// --></mce:script>");
         }
         else
         {
             Response.Write("<mce:script type="text/javascript"><!--
 alert('系统中已经存在该套试卷,您可以直接输入学号进行查询!')
// --></mce:script>");
         }
        return;
    }
 

 一开始使用的不是sqlbulk.ColumnMappings.Add("题号", "题号");而是sqlbulk.ColumnMappings.Add(1, 1);

编译时出现:


--------------------------------------------------------------------------------

给定的 ColumnMapping 与源或目标中的任意列均不匹配    错误


--------------------------------------------------------------------------------

在百度了之后发现要用sqlbulk.ColumnMappings.Add("题号", "题号")这样的格式保证列与列的正确匹配。在用了这个方法之后又出现了新的问题 :  “ 从bcp 客户端收到的列长度无效”  错误。

 再次百度,得到解释:源表数据不符合目标表数据类型,或者超出目标表定义长度 而导致的原因。

修改创建表语句为


--------------------------------------------------------------------------------

view plaincopy to clipboardprint?
sql = "use MyOnlineExam   create table " + Tablename + "(题号 int primary Key, 题干 varchar(500), A varchar(500), B varchar(500), C varchar(500), D varchar(500), 学生选择答案 varchar(20),正确答案 varchar(20), 学号 varchar(14) )"; 
sql = "use MyOnlineExam   create table " + Tablename + "(题号 int primary Key, 题干 varchar(500), A varchar(500), B varchar(500), C varchar(500), D varchar(500), 学生选择答案 varchar(20),正确答案 varchar(20), 学号 varchar(14) )";

自此编译通过,完成从Excel到sqlserver中的导入。

以此记录下来,虽然都是百度来的知识,但是成长却是属于自己的。

 

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/HelloNull2010/archive/2010/10/17/5946954.aspx

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值