防止 SqlBulkCopy 更改 XML 值
Prevent SqlBulkCopy to change XML value
我正在使用 SqlBulkCopy
将数据从一个数据库传输到另一个数据库。我的问题是我的 XML 列将在批量复制期间更改。
我认为 SqlBulkCopy class 是 parsing/computing XML 并“简化”了 XML。
原值:
<Item></Item>
更改值:
<Item/>
这会导致我的验证过程出错,因为原始 XML 不是存储在目标数据库中的值。
有没有办法阻止 SqlBulkCopy
class 更改我的 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 表示在源数据库和目标数据库中是相同的。
问题与SqlBulkCopy
class无关。
我通过在字符串表示不相同的情况下添加特定验证来解决我的问题。如果是这样,我 运行 在 sql 服务器上 select 转换为 XML.
示例:
SELECT
CONVERT(XML, '<test><item></item></test>'
然后我得到这样的结果:
<test>
<item/>
</test>
也可以命令 sql 服务器保留空格。
更多关于这个问题:https://dba.stackexchange.com/questions/223496/sql-server-changes-xml-structure-when-inserted
我正在使用 SqlBulkCopy
将数据从一个数据库传输到另一个数据库。我的问题是我的 XML 列将在批量复制期间更改。
我认为 SqlBulkCopy class 是 parsing/computing XML 并“简化”了 XML。
原值:
<Item></Item>
更改值:
<Item/>
这会导致我的验证过程出错,因为原始 XML 不是存储在目标数据库中的值。
有没有办法阻止 SqlBulkCopy
class 更改我的 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 表示在源数据库和目标数据库中是相同的。
问题与SqlBulkCopy
class无关。
我通过在字符串表示不相同的情况下添加特定验证来解决我的问题。如果是这样,我 运行 在 sql 服务器上 select 转换为 XML.
示例:
SELECT
CONVERT(XML, '<test><item></item></test>'
然后我得到这样的结果:
<test>
<item/>
</test>
也可以命令 sql 服务器保留空格。 更多关于这个问题:https://dba.stackexchange.com/questions/223496/sql-server-changes-xml-structure-when-inserted