Excel 导入(sqlbulk.ColumnMappings + 创建数据表)

今日在导入Excel后要生成一张表,将Excel表内容转化为数据库中表内容时使用到System.Data.SqlClient.SqlBulkCopy这个类的对象,其中有个ColumnMapping.Add的对象方法,

[c-sharp] view plain copy print ?
  1.   /***** Excel导入 *****/  
  2.     private void PapperImport(string name)  
  3.     {  
  4.        string Tablename = name.Remove(name.IndexOf("."));  
  5.        Tablename = Tablename.Substring(name.LastIndexOf("//") + 1);  
  6.        string sql = "select ObjectProperty(Object_ID( '" + Tablename + "'),'IsUserTable')"//判断是否存在某张表的sql语句。  
  7.          if (new DataBase().GetDataSetSql(sql).Tables[0].Rows[0][0].ToString() == "")  
  8.          {  
  9.              //创建Excel连接   
  10.              //连接字符串   
  11.              string strConn = "Provider =Microsoft.Jet.OLEDB.4.0; Data Source = " + name + "; Extended Properties='Excel 8.0; HDR = YES';";  
  12.              OleDbConnection conn = new OleDbConnection(strConn);  
  13.              conn.Open();  
  14.              string strExcel = "";  
  15.              OleDbDataAdapter myCommand = null;  
  16.              strExcel = "select * from [Sheet1$]";  
  17.              myCommand = new OleDbDataAdapter(strExcel, strConn);  
  18.              DataTable dt = new DataTable();  
  19.              myCommand.Fill(dt);  
  20.              conn.Close();  
  21.              //===导入到datatable完毕========================  
  22.              //========生成数据库表==========   
  23.              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) )";  
  24.              new DataBase().ExecuteNonQuery(sql);  
  25.              //=========往数据库表中添加数据================  
  26.              System.Data.SqlClient.SqlBulkCopy sqlbulk = new System.Data.SqlClient.SqlBulkCopy(System.Configuration.ConfigurationManager.AppSettings["constr"]);  
  27.              sqlbulk.DestinationTableName = Tablename;  
  28.              try  
  29.              {  
  30.                  sqlbulk.ColumnMappings.Add("题号""题号");  
  31.                  sqlbulk.ColumnMappings.Add("题干""题干");  
  32.                  sqlbulk.ColumnMappings.Add("A""A");  
  33.                  sqlbulk.ColumnMappings.Add("B""B");  
  34.                  sqlbulk.ColumnMappings.Add("C""C");  
  35.                  sqlbulk.ColumnMappings.Add("D""D");  
  36.                  sqlbulk.ColumnMappings.Add("学生选择答案""学生选择答案");  
  37.                  sqlbulk.ColumnMappings.Add("正确答案""正确答案");  
  38.                  sqlbulk.ColumnMappings.Add("学号""学号");  
  39.                  sqlbulk.WriteToServer(dt);  
  40.                  sqlbulk.Close();  
  41.              }  
  42.              catch (Exception ex)  
  43.              {  
  44.                  Response.Write("<mce:script type="text/javascript"><!--  
  45.  alert('" + ex.Message + "')   
  46. // --></mce:script>");   
  47.                  sql = "use MyOnlineExam  drop table " + Tablename;  
  48.                  new DataBase().ExecuteNonQuery(sql);  
  49.                  return;  
  50.              }             
  51.              Response.Write("<mce:script type="text/javascript"><!--  
  52.  alert('该学期所有试卷已经成功导入到系统,您可以输入学号进行查询!')   
  53. // --></mce:script>");   
  54.          }  
  55.          else  
  56.          {  
  57.              Response.Write("<mce:script type="text/javascript"><!--  
  58.  alert('系统中已经存在该套试卷,您可以直接输入学号进行查询!')  
  59. // --></mce:script>");   
  60.          }  
  61.         return;  
  62.     }  

 

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

编译时出现:


 

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


 

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

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

修改创建表语句为


 

[c-sharp] view plain copy print ?
  1. 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中的导入。

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

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值