2015-11-01 153 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