如何更改DataTable类型?

如何更改DataTable类型?

问题描述:

如何克隆DataTable并将其列和行类型更改为decimal如何更改DataTable类型?

private static DataTable GetDataTabletFromCSVFile(string csv_file_path) 
{ 
    DataTable csvData = new DataTable(); 
    using (TextFieldParser csvReader = new TextFieldParser(csv_file_path)) 
    { 
     csvReader.SetDelimiters(new string[] { "," }); 
     csvReader.HasFieldsEnclosedInQuotes = true; 
     string[] colFields = csvReader.ReadFields(); 
     foreach (string column in colFields) 
     { 
      DataColumn datecolumn = new DataColumn(column); 
      datecolumn.AllowDBNull = true; 
      csvData.Columns.Add(datecolumn); 
      ; 
     } 
     while (!csvReader.EndOfData) 
     { 
      string[] fieldData = csvReader.ReadFields(); 
      //Making empty value as null 
      for (int i = 0; i < fieldData.Length; i++) 
      { 
       if (fieldData[i] == "") 
       { 
        fieldData[i] = null; 
       } 
      } 
      csvData.Rows.Add(fieldData); 
     } 
    } 

    return csvData; 
} 

你必须使用decimal.TryParse到字符串解析到decimal并使用正确的列式。然后你可以使用DataRow.SetField扩展支持可空类型:

foreach (string column in colFields) 
{ 
    DataColumn datacolumn = new DataColumn(column, typeof(decimal)); 
    datacolumn.AllowDBNull = true; 
    csvData.Columns.Add(datacolumn); 
} 
while (!csvReader.EndOfData) 
{ 
    string[] fieldData = csvReader.ReadFields(); 
    DataRow addedRow = csvData.Rows.Add(); 
    for (int i = 0; i < fieldData.Length; i++) 
    { 
     decimal value; 
     if(decimal.TryParse(fieldData[i].Trim(), out value)) 
      addedRow.SetField<decimal?>(i, value); 
     else 
      addedRow.SetField<decimal?>(i, null); 
    } 
} 
+0

decimal.TryParse哇它是工作谢谢蒂姆:))) –

使用允许类型参数的DataColumn构造函数。

public DataColumn(
    string columnName, 
    Type dataType 
) 

http://msdn.microsoft.com/es-es/library/x1tyd60z(v=vs.110).aspx

所以,如果每列将是小数类型的

foreach (string column in colFields) 
    { 
     DataColumn datecolumn = new DataColumn(column, typeof(decimal)); 
     datecolumn.AllowDBNull = true; 
     csvData.Columns.Add(datecolumn); 
    } 
+0

当我用这一个ArgumentException了未处理csvData.Rows.Add(fieldData);输入字符串的格式不正确 –

+0

当然,你需要转换正如您声明此列包含十进制值,将csv文件中的值添加到列之前的十进制值。使用decimal.Parse(fieldData)或Convert.ToDecimal(fieldData)。 csvData.Rows.Add(decimal.Parse(fieldData)) – Oscar

+0

我比较table1和表2(字符串类型),然后建立一个新表,我需要排序(table3)。我可以建立table3行为十进制(有-ve值我需要它转换为十进制,因此它认为-ve符号) –

您可以在创建的DataColumn时指定的数据类型。如果不指定数据(在你的例子一样)明确地键入列将是字符串类型:

DataColumn datecolumn = new DataColumn(column, typeof(Decimal));