SQL 批量复制覆盖数据类型
SQL Bulkcopy coverting data type
在我的 .Net 项目中,我正在加载一个 CSV 文件,这样我就可以获取该数据,用它做一些事情,然后将结果输出到一个 excel 文件中。
我通过代码中的数据 table 来处理这个问题。在我的结果文件中,我添加了一个我称之为 'resetdate' 的新列,我这样做是这样的:
nettingTable.Columns.Add("resetdate");
清除数据中的所有空单元格并将值设置为 DBNull
,这样我的数据库就不会出现错误。该代码如下所示:
public DataTable PreProcess(DataTable dt)
{
foreach (DataColumn col in dt.Columns)
if (_config.ColumnNames.Contains(col.ColumnName))
{
foreach (DataRow row in col.Table.Rows)
{
// We only care about the date
// This trims out the any time values that may have automatically been added
if(row[col].ToString().Length > 10)
{
row[col] = row[col].ToString().Substring(0, 10);
}
if (row[col].ToString().Length == 0)
{
row[col] = DBNull.Value;
}
}
}
return dt;
}
这里没有什么突破性的东西,而且长期以来一直有效。但是,我的新列 resetdate
是从我的 CSV 文件中名为 nextresetdate
的列中填充的,我正在使用以下代码执行此操作:
foreach (DataRow dr in nettingTable.Rows)
{
dr["resetdate"] = dr["nextresetdate"];
}
一旦所有内容都被填充,它就会被发送到我的数据库,在那里我有一个 table,其中有一个名为“ResetDate
”的列,其值再次为“DateTime
” ,这一切都没有问题。
现在,当我尝试 运行 我的代码进行上述更改时,我收到以下错误消息:
Rows: 2-453 Error: The given value of type String from the data source cannot be converted to type int of the specified target column.
内部异常读作:
InvalidOperationException: The given value of type String from the data source cannot be converted to type datetime of the specified target column.
我尝试将我的代码修改为:
foreach (DataRow dr in nettingTable.Rows)
{
// this was done both as I've wrote and passing
// in the intended value as a variable, same result
dr["resetdate"] = DateTime.Parse(dr["nextresetdate"]);
}
但是我得到了同样的错误。我在这里做错了什么?
DataColumnCollection::Add()
的重载仅采用列名,将 string
指定为新列的数据类型,如 link 中所述。您是否尝试过以下方法?
nettingTable.Columns.Add("resetdate", typeof(DateTime));
在我的 .Net 项目中,我正在加载一个 CSV 文件,这样我就可以获取该数据,用它做一些事情,然后将结果输出到一个 excel 文件中。
我通过代码中的数据 table 来处理这个问题。在我的结果文件中,我添加了一个我称之为 'resetdate' 的新列,我这样做是这样的:
nettingTable.Columns.Add("resetdate");
清除数据中的所有空单元格并将值设置为 DBNull
,这样我的数据库就不会出现错误。该代码如下所示:
public DataTable PreProcess(DataTable dt)
{
foreach (DataColumn col in dt.Columns)
if (_config.ColumnNames.Contains(col.ColumnName))
{
foreach (DataRow row in col.Table.Rows)
{
// We only care about the date
// This trims out the any time values that may have automatically been added
if(row[col].ToString().Length > 10)
{
row[col] = row[col].ToString().Substring(0, 10);
}
if (row[col].ToString().Length == 0)
{
row[col] = DBNull.Value;
}
}
}
return dt;
}
这里没有什么突破性的东西,而且长期以来一直有效。但是,我的新列 resetdate
是从我的 CSV 文件中名为 nextresetdate
的列中填充的,我正在使用以下代码执行此操作:
foreach (DataRow dr in nettingTable.Rows)
{
dr["resetdate"] = dr["nextresetdate"];
}
一旦所有内容都被填充,它就会被发送到我的数据库,在那里我有一个 table,其中有一个名为“ResetDate
”的列,其值再次为“DateTime
” ,这一切都没有问题。
现在,当我尝试 运行 我的代码进行上述更改时,我收到以下错误消息:
Rows: 2-453 Error: The given value of type String from the data source cannot be converted to type int of the specified target column.
内部异常读作:
InvalidOperationException: The given value of type String from the data source cannot be converted to type datetime of the specified target column.
我尝试将我的代码修改为:
foreach (DataRow dr in nettingTable.Rows)
{
// this was done both as I've wrote and passing
// in the intended value as a variable, same result
dr["resetdate"] = DateTime.Parse(dr["nextresetdate"]);
}
但是我得到了同样的错误。我在这里做错了什么?
DataColumnCollection::Add()
的重载仅采用列名,将 string
指定为新列的数据类型,如 link 中所述。您是否尝试过以下方法?
nettingTable.Columns.Add("resetdate", typeof(DateTime));