2012-04-05 85 views
0

我已經無數遍了我的代碼,並希望有人可以幫助我看到我不知道的東西。我試圖從Excel中將數據從VS2010中的多列拖到SQL表中,但是當我嘗試上載數據時,出現錯誤「無法找到列8」。我沒有看到第8欄和其他任何欄目都沒有錯。還有誰?謝謝!Excel到SQL代碼:找不到列8錯誤

protected void Button1_Click(object sender, EventArgs e) 
{ 
    //make local copy 
    string sheetname = "Sheet1"; 
    string path = Server.MapPath("~/Import.xls"); 
    //connect to local Excel 
    try 
    { 

     FileUpload.SaveAs(path); 
     System.Data.OleDb.OleDbConnection MyConnection; 
     System.Data.DataSet DtSet; 
     System.Data.OleDb.OleDbDataAdapter MyCommand; //check sheet name 
     MyConnection = new System.Data.OleDb.OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + path + ";Extended Properties=Excel 12.0;"); 
     MyCommand = new System.Data.OleDb.OleDbDataAdapter("select * from [" + sheetname + "$]", MyConnection); 
     MyCommand.TableMappings.Add("Table", "TestTable"); 
     DtSet = new System.Data.DataSet(); 
     MyCommand.Fill(DtSet); 
     SqlConnection curConnection = new SqlConnection(@"Data Source=1tc-Techcomm2;Initial Catalog=EventManagement;Integrated Security=True"); 
     curConnection.Open(); 
     SqlCommand curCommand; 
     SqlParameter param; 
     string str; 

     for (int i = 0; i < DtSet.Tables[0].Rows.Count; i++) 
     { 
      if (DtSet.Tables[0].Rows[i][1] == DBNull.Value) 
       continue; 
      curCommand = curConnection.CreateCommand(); 
      curCommand.CommandText = @"Insert into TestSP (SessionHead_Title, SessionHead_Type, SessionHead_Description, SessionHead_Confirmed, SessionHead_Presenter, SessionHead_Champion, SessionHead_Objective, SessionHead_Notes, SessionHead_Schedule, SessionHead_Equipment, SessionHead_Hardware, SessionHead_CDA) Values (@a,@b,@c,@d,@e,@f,@g,@h,@i,@j,@k,@l,@m)"; 
      for (int j = 0; j < 13; j++) 
      { 
       param = new SqlParameter(); 
       str = "@"; 
       str += (char)('a' + j); 
       param.ParameterName = str; 
       param.SqlDbType = SqlDbType.VarChar; 
       param.Value = DtSet.Tables[0].Rows[i][j];//This is where it errors out at after 8 times through 
       curCommand.Parameters.Add(param); 

      } 
      Label1.Text = "THE EXCEL DATE HAS SUCCESSFULLY BEEN SENT TO THE DATABASE"; 

      int Event_Id = curCommand.ExecuteNonQuery(); 

     } 
     MyConnection.Close(); 
     curConnection.Close(); 
    } 
    catch (Exception ex) 
    { 
     //Response.Write(ex.ToString()); 
     Label1.Text = ex.Message; 

    } 
} 
+0

數據集中第8列的數據是否存在?你是否已經通過調試器進行了檢查? – 2012-04-05 22:44:38

+0

是的,在8列單元格之一中有數據,我已經設置爲接受SQL中的nvarchar(MAX)。調試器通過param.Value = DtSet.Tables [0] .Rows [i] [j]處的for(int j = 0,j <13; j ++)節捕獲8次。 – Sarah 2012-04-09 15:38:42

回答

1

我認爲問題在於電子表格列標題與表格標題不匹配。我在某處讀到SQL Server表中的列名必須在Excel文件中相同。我想這解決了它......感謝您的幫助!

+0

你爲什麼不接受你的答案? – AYK 2012-04-12 10:31:44

0

如果您知道SQL Server上表的結構,請嘗試使用SqlBulkCopy。映射您的列並將其寫入服務器。您已經擁有DataSet中的數據。

SqlBulkCopy _bc = new SqlBulkCopy(curConnection); 

_bc.DestinationTableName = "TestSP"; 

_bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("DataTableColumnName1", "SQLServerColumnName1"); 
_bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("DataTableColumnName2", "SQLServerColumnName2"); 
_bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("DataTableColumnName3", "SQLServerColumnName3"); 
_bc.ColumnMappings.Add(new SqlBulkCopyColumnMapping("DataTableColumnName4", "SQLServerColumnName4"); 

_bc.WriteToServer(DtSet.Tables[0]); 

如果您不知道結構,但仍必須具有創造性,仍然可以使用此過程。我必須這樣做,這非常有趣。

+0

在'SqlBulkCopyColumnMapping'你也可以使用列索引而不是列名 – Jmyster 2012-04-05 22:51:43

+0

謝謝,但我不認爲我可以批量提取數據,因爲我最終需要能夠從其他SQL表中提取數據,這取決於所提取的數據以及基於該信息將數據拉入另一個系統。此外,這張表最終將成爲許多具有相同標題的不同電子表格的持有者。 – Sarah 2012-04-09 15:42:02