转换数据表中列的类型

时间:2013-08-04 15:56:07

标签: string types datatable format clone

我将一个csv文件导入到一个数据表中,遗憾的是,这个数据表将我的数据放入字符串列中,即使是那些有数字的列。

所以我必须将某些列的格式(除非有其他方法)转换为datetime,integer或double,为什么我编写了以下代码:

Public Sub ChangeFieldType(ByRef dataTable As DataTable, ByVal fieldIndex As Integer, ByVal newType As Type)
    Dim newDataTable As DataTable = dataTable.Clone

    newDataTable.Columns(fieldIndex).DataType = newType
    For Each row As DataRow In dataTable.Rows
        newDataTable.ImportRow(row)
    Next
    dataTable = newDataTable
End Sub

但是有一些空单元格,字符串格式为vbnullstring。我的问题是,有一种比我的代码更容易的方法,如果没有,那么比转换空单元格的方式更快:

Public Sub ChangeFieldType(ByRef dataTable As DataTable, ByVal fieldIndex As Integer, ByVal newType As Type)
    Dim newDataTable As DataTable = dataTable.Clone

    newDataTable.Columns(fieldIndex).DataType = newType
    For Each row As DataRow In dataTable.Rows
        If row(fieldIndex) = vbNullString Then
            row(fieldIndex) = Nothing
        End If
        newDataTable.ImportRow(row)
    Next
    dataTable = newDataTable
End Sub

因为这非常慢。

由于

2 个答案:

答案 0 :(得分:1)

如果您事先已经知道了列类型,那么在导入csv文件时,您应该创建一个包含这些列的表,然后填充数据。克隆表然后再次填充数据是一个非常缓慢的过程,尤其是在数据很大的情况下

您可以参考以下内容 http://social.msdn.microsoft.com/Forums/windows/en-US/34b6a1e8-5103-42a3-aa45-cdc0cea461f2/importing-csv-file-to-datatable-problem-with-converting-data-type

答案 1 :(得分:0)

使用以下代码转换DataTable中列的数据类型

public partial class _Default : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        DataTable table = GetTable();

        DataColumn dc = new DataColumn("MyDate", Type.GetType("System.String"));
        table.Columns.Add(dc);

        foreach (DataRow row in table.Rows)
        {
            row["MyDate"] =Convert.ToDateTime(row["Date"].ToString()).ToString("dd-MM-yyyy");
        }

        GridView1.DataSource = table;
        GridView1.DataBind();
    }



    static DataTable GetTable()
    {
        // Here we create a DataTable with four columns.
        DataTable table = new DataTable();
        table.Columns.Add("ID", typeof(int));
        table.Columns.Add("SortName", typeof(string));
        table.Columns.Add("FullName", typeof(string));
        table.Columns.Add("Date", typeof(DateTime));

        // Here we add five DataRows.
        table.Rows.Add(25, "Geli", "Smruti", DateTime.Now.AddDays(1).ToString("yyyy-MM-dd"));
        table.Rows.Add(50, "Gelu", "Ramesh", DateTime.Now.AddDays(2).ToString("yyyy-MM-dd"));
        table.Rows.Add(10, "Nitu", "Mama", DateTime.Now.AddDays(3).ToString("yyyy-MM-dd"));
        table.Rows.Add(21, "Babu", "Gelu", DateTime.Now.AddDays(4).ToString("yyyy-MM-dd"));        
        return table;
    }
}

将列添加到现有DataTable&将数据更新为要更改DataType的新列。