【发布时间】:2021-10-23 13:45:17
【问题描述】:
我正在使用SqlBulkCopy 将数据从一个数据库传输到另一个数据库。我的问题是我的 XML 列将在批量复制期间更改。
我认为 SqlBulkCopy 类正在解析/计算 XML 并“简化” XML。
原值:
<Item></Item>
改变值:
<Item/>
这会导致我的验证过程出错,因为原始 XML 不是存储在目标数据库中的值。
有没有办法阻止SqlBulkCopy 类更改我的XML?
因为之前生成的SQL语句不知道有XML列,所以我也无法转换成nvarchar(max)。
我的代码:
using (SqlDataAdapter adapter = new SqlDataAdapter(source_command))
{
using (DataTable table = new DataTable())
{
adapter.Fill(table);
using (SqlConnection destination = new SqlConnection(destination_connectionstring))
{
destination.Open();
using (SqlBulkCopy bulkCopy = new SqlBulkCopy(destination, SqlBulkCopyOptions.KeepIdentity | SqlBulkCopyOptions.KeepNulls | SqlBulkCopyOptions.CheckConstraints, null))
{
bulkCopy.DestinationTableName = destination_table;
bulkCopy.BulkCopyTimeout = 1200;
foreach (DataColumn column in table.Columns)
{
bulkCopy.ColumnMappings.Add(new SqlBulkCopyColumnMapping(column.ColumnName, column.ColumnName));
}
try
{
bulkCopy.WriteToServer(table);
}
catch (Exception ex)
{
Log.Logger.Error(ex.ToString());
throw;
}
finally
{
table.Dispose();
}
}
}
}
}
xml-string 表示在源数据库和目标数据库中是相同的,这一点很重要。
【问题讨论】:
-
它仍然是有效的 XML,代表完全相同的数据,所以你应该改变你的验证来处理它
-
当然是,但是处理系统假定它是完全相同的符号。由于处理系统的限制,在这方面无法更改验证过程。不幸的是,我不能忽视这个要求
-
Unfortunately, I cannot ignore this requirement.不幸的是,SqlBulkCopyOptions没有CaterForPoorlyWrittenProcessingSystemsThatTreatXmlAsText标志。如果您“不能”更改验证过程,并且“不能”将列数据类型从xml更改为nvarchar(max),则不能使用SqlBulkCopy。 -
table中列的数据类型是什么,你是怎么传的?你也许可以通过XmlDocument和PreserveWhitespace = true
标签: c# sql sql-server xml sqlbulkcopy