【问题标题】:How to change DataTable type?如何更改数据表类型?
【发布时间】:2014-04-08 20:30:34
【问题描述】:

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

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;
} 

【问题讨论】:

    标签: c# datatable type-conversion decimal


    【解决方案1】:

    使用允许类型参数的 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);
        }
    

    【讨论】:

    • 当我使用这个 ArgumentException 时未处理 csvData.Rows.Add(fieldData);输入字符串格式不正确
    • 当然,您需要将值从 csv 文件转换为十进制,然后再将其添加到列中,因为您声明此列包含十进制值。使用 decimal.Parse(fieldData) 或 Convert.ToDecimal(fieldData)。 csvData.Rows.Add(decimal.Parse(fieldData))
    • 我正在比较表 1 和表 2(字符串类型),然后构建一个我需要排序的新表(表 3)。我可以将表 3 行构建为十进制(有 -ve 值我需要它转换为十进制,因此它考虑 -ve 符号)
    【解决方案2】:

    您可以在创建 DataColumn 时指定数据类型。如果您没有明确指定数据类型(如在您的示例中),则该列将是字符串类型:

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

    【讨论】:

      【解决方案3】:

      您必须使用 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);
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-12-26
        • 2012-02-20
        • 2017-09-13
        • 2011-11-02
        • 2014-03-05
        • 2013-09-12
        • 2018-05-28
        • 2019-11-08
        相关资源
        最近更新 更多