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("text/javascript">");   
  45.                  sql = "use MyOnlineExam  drop table " + Tablename;  
  46.                  new DataBase().ExecuteNonQuery(sql);  
  47.                  return;  
  48.              }             
  49.              Response.Write("text/javascript">");   
  50.          }  
  51.          else  
  52.          {  
  53.              Response.Write("text/javascript">");   
  54.          }  
  55.         return;  
  56.     }  

 

 一开始使用的不是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中的导入。

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

 

 

你可能感兴趣的:(C#—ASP.NET,Office文件操作)