2015-11-01 213 views
1

我使用ASP.net來製作一些應用程序,但我有一個問題,問題在於用戶應該導入excel文件(文件模式總是相同),但在excel文件中有一個細胞與一堆名字,看起來像這樣導入excel數據到SQL

ID   Names 
    1  Mick Jagger 
      Elton John 
    2  James Hetfield 
      Axl Rose 

等等,所以我必須每單元2名或更多的名字......到目前爲止,我進口的Excel文件的DataSet

sqlCMD.Connection.Open(); 
      using (OleDbConnection excelConnection = new OleDbConnection(excelConnString)) 
      { 
       using (OleDbCommand cmd = new OleDbCommand("Select " + CompanyID + ", * 
                  From [Sheet1$]" 
       , excelConnection)) 
       { 
        OleDbDataAdapter daSheet = 
        new OleDbDataAdapter(cmd.CommandText, excelConnection); 

        DataTable table; 
        table = new DataTable(); 
        daSheet.Fill(table); 
        PreparedData.Tables.Add(table); 
       } 
      } 

所以在成功導入之後,我列出了導入到數據集中的對象列表,這非常棒,但是每個單元格中的這2個或更多名稱給出我的麻煩,因爲在對象的價值它是這樣寫的「Mick Jagger \ n埃爾頓約翰」,所以我試圖取代它,並將其添加回數據集(我試圖創建新的數據集,但沒有成功)

 int Rows = PreparedData.Tables[0].Rows.Count; 
     int Columns = PreparedData.Tables[0].Columns.Count; 

     for (int i = 0; i < Rows; i++) 
     { 
      for (int s = 0; s < Columns; s++) 
      { 
       if (s == 4 || s == 5 || s == 6 || s == 7) 
       { 
        object ValueToReplace; 
        object Replaced; 

        ValueToReplace = PreparedData.Tables[0].Rows[i].ItemArray[s]; 
        Replaced = ValueToReplace.ToString().Replace("\n", ";"); 

        PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced; 
       } 
      } 
     } 

點這是在結束時,我想的是修改後的數據導入到使用我的SQL表(工作)

 SqlBulkCopy bulkcopy = new SqlBulkCopy(sqlCMD.Connection); 
    bulkcopy.DestinationTableName = "Excel_Import"; 
     try 
     { 
      bulkcopy.WriteToServer(FixedData); 
     } 
     catch (Exception e) 
     { 

     } 

所以,你可以幫助我,指點我,我怎麼會修改

PreparedData.Tables[0].Rows[i].ItemArray[s] = Replaced; 

回答

1

當您引用ItemArray屬性時,.NET Framework將在當前行中構建數據的副本。如果您嘗試使用它來設置新值,則可以將副本上的值設置爲不在原始行數據上。

這是從Reference souce

public object[] ItemArray { 
     get { 
      int record = GetDefaultRecord(); 
      _table.recordManager.VerifyRecord(record, this); 
      object[] values = new object[_columns.Count]; 
      for (int i = 0; i < values.Length; i++) { 
       DataColumn column = _columns[i]; 
       VerifyValueFromStorage(column, DataRowVersion.Default, column[record]); 
       values[i] = column[record]; 
      } 
      return values; 
     } 

ItemArray屬性的源代碼正如你可以看到,在每次參考創建的對象陣列的一個新的副本,並填充有數據的ItemArray屬性的時間。現在,如果更改此數組中的條目,您也不會更改由DataRow類維護的內部數據。 DataRow對您的更改根本未知。

但是該解決方案是非常簡單,只需使用

ValueToReplace = PreparedData.Tables[0].Rows[i][s].ToString(); 
PreparedData.Tables[0].Rows[i][s] = ValueToReplace.Replace("\n", ";"); 
+0

謝謝你的男人......你幫我,這就像魅力! – Veljko89