2015-10-14 66 views
0

我有以下VB.net代碼:轉換數據集代碼VB.net到C#

Private Function ReorgFileDataset(ByRef InDataSet As DataSet) As DataSet 
    Dim _ResultDataRow, _DataRow As DataRow 
    Dim _ResultDataSet As New DataSet 
    Dim _ResultDataTable As New DataTable 
    _ResultDataSet.Tables.Add(_ResultDataTable) 
    Dim ColumnName, Value As String 
    Dim FileID As Integer 
    For Each _DataRow In InDataSet.Tables(0).Rows 
    ColumnName = _DataRow.Item("FKP_KEYWORD") 
    If Not _ResultDataTable.Columns.Contains(ColumnName) Then 
     _ResultDataTable.Columns.Add(ColumnName) 
    End If 
    Next 
    _ResultDataTable.Columns.Add("DATE_SENT") 

    _ResultDataRow = Nothing 
    For Each _DataRow In InDataSet.Tables(0).Rows 
    If FileID <> _DataRow.Item("FD_RID") Then 
     If Not _ResultDataRow Is Nothing Then 
      _ResultDataTable.Rows.Add(_ResultDataRow) 
     End If 
     FileID = _DataRow.Item("FD_RID") 
     _ResultDataRow = _ResultDataTable.NewRow() 
     _ResultDataRow.Item("DATE_SENT") = _DataRow.Item("FD_LASTMODIFIED") 
    End If 
    If _DataRow.Item("FKP_KEYWORD").GetType IsNot GetType(DBNull) And _ 
     _DataRow.Item("FKP_VALUE").GetType IsNot GetType(DBNull) Then 
     ColumnName = _DataRow.Item("FKP_KEYWORD") 
     Value = _DataRow.Item("FKP_VALUE") 
     _ResultDataRow.Item(ColumnName) = Value 
    End If 
    Next 
    If _ResultDataRow IsNot Nothing Then 
    _ResultDataTable.Rows.Add(_ResultDataRow) 
    End If 

    Return _ResultDataSet 
End Function 

當我通過轉換器運行它,我得到這個C#代碼:

private DataSet ReorgFileDataset(DataSet InDataSet) 
{ 
    DataRow _ResultDataRow = default(DataRow); 
    DataSet _ResultDataSet = new DataSet(); 
    DataTable _ResultDataTable = new DataTable(); 
    _ResultDataSet.Tables.Add(_ResultDataTable); 
    string ColumnName = null; 
    string Value = null; 
    int FileID = 0; 


    foreach (DataRow _DataRow in InDataSet.Tables[0].Rows) { 
     ColumnName = _DataRow.Item("FKP_KEYWORD"); 
     if (!_ResultDataTable.Columns.Contains(ColumnName)) { 
      _ResultDataTable.Columns.Add(ColumnName); 
     } 
    } 
    _ResultDataTable.Columns.Add("DATE_SENT"); 

    _ResultDataRow = null; 
    foreach (DataRow _DataRow in InDataSet.Tables[0].Rows) { 
     if (FileID != _DataRow.Item("FD_RID")) { 
      if ((_ResultDataRow != null)) { 
       _ResultDataTable.Rows.Add(_ResultDataRow); 
      } 
      FileID = _DataRow.Item("FD_RID"); 
      _ResultDataRow = _ResultDataTable.NewRow(); 
      _ResultDataRow.Item("DATE_SENT") = _DataRow.Item("FD_LASTMODIFIED"); 
     } 
     if (!object.ReferenceEquals(_DataRow.Item("FKP_KEYWORD").GetType, typeof(DBNull)) & !object.ReferenceEquals(_DataRow.Item("FKP_VALUE").GetType, typeof(DBNull))) { 
      ColumnName = _DataRow.Item("FKP_KEYWORD"); 
      Value = _DataRow.Item("FKP_VALUE"); 
      _ResultDataRow.Item(ColumnName) = Value; 
     } 
    } 
    if (_ResultDataRow != null) { 
     _ResultDataTable.Rows.Add(_ResultDataRow); 
    } 

    return _ResultDataSet; 
} 

我修改InDataSet.Tables(0)InDataSet.Tables[0]但是,有幾個我無法修復的錯誤,因爲intellisence沒有DataRow的Item屬性。我也不確定最後一條語句是否在檢查空值。

我可以在這裏得到一些幫助嗎?

+0

你得到什麼錯誤? 'DataRow.Item'在C#中是一個有效的屬性,就像它在VB.NET中一樣。最後一行等同於VB.NET代碼中的最後一行 - 如果DataRow不爲空,則將其添加到結果中。 'null'是C#VB.NET中的Nothing。 – Tim

+1

Item索引器隱含在C#類型中,所以在VB中如果使用'_DataRow.Item()',則在C#中它將是'_DataRow []'。由於你可以擁有一個名爲'Item'的C#屬性或方法,所以它對轉換器來說是一件非常困難的事情,所以它通常需要安全的道路並將它放在那裏,迫使你修復它們。 –

+0

正如我所說的,DataRow中的NO Item屬性顯示在Intellisense,ONLY ItemArray中。 – MB34

回答

0

這SO張貼在這裏幾乎是重複......

In C#: Why no 'Item' on System.Data.DataRow?

更具體地講,雖然,您可以訪問使用索引數據列的列。例如,你有這行代碼...

ColumnName = _DataRow.Item("FKP_KEYWORD"); 

你可以把它改成這個...

ColumnName = _DataRow["FKP_KEYWORD"].ToString(); 
+1

那麼爲什麼不投票結束重複呢? –

+0

它在MSDN中顯示爲C#的有效屬性。 – MB34

+0

仍然沒有答案的最後一部分關於空值 – MB34