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

今日在导入Excel后要生成一张表,将Excel表内容转化为数据库中表内容时使用到System.Data.SqlClient.SqlBulkCopy这个类的对象,其中有个ColumnMapping.Add的对象方法, /***** 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(""); sql = "use MyOnlineExam drop table " + Tablename; new DataBase().ExecuteNonQuery(sql); return; } Response.Write(""); } else { Response.Write(""); } return; }  

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

编译时出现:


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


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

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

修改创建表语句为


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中的导入。

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

你可能感兴趣的:(导入导出)