我有一个System.Data.DataTable,它通过读取CSV文件来填充,该文件将每列的数据类型设置为字符串.
我想将DataTable的内容追加到现有的数据库表 - 目前这是使用SqlBulkCopy和DataTable作为源完成的.
但是,需要更改DataTable的列数据类型以匹配目标数据库表的模式,从而处理空值.
我对ADO.NET不太熟悉,所以一直在寻找一种干净的方法吗?
谢谢.
我写了这个通用函数来完成这项工作,它对我很有用:
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));
你不能改变DataType
的DataColumn
填充数据之后.它不是只读属性,但如果您在已有数据后尝试更改它,则会在运行时收到异常.
从文档:
在列开始存储数据后更改此属性时会生成异常.
因此,您必须在开始时确保正确的列类型(如果可能),或者DataTable
专门为从原始数据导入和复制数据创建新的列类型DataTable
.
您还可以编写一个自定义IDataReader
类,从您的读取DataTable
并执行即时转换并将其传递给SqlBulkCopy
- 它会更高效,但它显然不是一个快速解决方案.