当前位置:  开发笔记 > 编程语言 > 正文

更改填充的DataTable列数据类型

如何解决《更改填充的DataTable列数据类型》经验,为你挑选了2个好方法。

我有一个System.Data.DataTable,它通过读取CSV文件来填充,该文件将每列的数据类型设置为字符串.

我想将DataTable的内容追加到现有的数据库表 - 目前这是使用SqlBulkCopy和DataTable作为源完成的.

但是,需要更改DataTable的列数据类型以匹配目标数据库表的模式,从而处理空值.

我对ADO.NET不太熟悉,所以一直在寻找一种干净的方法吗?

谢谢.



1> Gisway..:

我写了这个通用函数来完成这项工作,它对我很有用:

public static bool ChangeColumnDataType(DataTable table, string columnname, Type newtype)
{
    if (table.Columns.Contains(columnname) == false)
        return false;

    DataColumn column= table.Columns[columnname];
    if (column.DataType == newtype)
        return true;

    try
    {
        DataColumn newcolumn = new DataColumn("temporary", newtype);
        table.Columns.Add(newcolumn);
        foreach (DataRow row in table.Rows)
        {
            try
            {
                row["temporary"] = Convert.ChangeType(row[columnname], newtype);
            }
            catch
            {
            }
        }
        table.Columns.Remove(columnname);
        newcolumn.ColumnName = columnname;
    }
    catch (Exception)
    {
        return false;
    }

    return true;
}

你可以复制代码并将它放在一个类(MyClass here)中,并像这样使用它作为一个例子:

MyClass.ChangeColumnDataType(table, "GEOST", typeof (int));


唯一的问题-集合的末尾添加了新列,因此,例如,如果将其绑定到具有“ autogeneratecolumns = true”的网格,则其序数位置将有所不同

2> Aaronaught..:

你不能改变DataTypeDataColumn填充数据之后.它不是只读属性,但如果您在已有数据后尝试更改它,则会在运行时收到异常.

从文档:

在列开始存储数据后更改此属性时会生成异常.

因此,您必须在开始时确保正确的列类型(如果可能),或者DataTable专门为从原始数据导入和复制数据创建新的列类型DataTable.

您还可以编写一个自定义IDataReader类,从您的读取DataTable并执行即时转换并将其传递给SqlBulkCopy- 它会更高效,但它显然不是一个快速解决方案.

推荐阅读
jerry613
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有