【问题标题】:Prevent duplicates when insert by SQLXMLBULKLOADLib通过 SQLXMLBULKLOADLib 插入时防止重复
【发布时间】:2020-05-31 16:20:50
【问题描述】:

我想知道在我们使用SQLXMLBULKLOADLib 时是否有办法防止插入重复行?我尝试将UNIQUE NONCLUSTERED INDEX 添加到SQL 表中,但是通过SQLXMLBulkLoad4Class 插入失败。

所以我的代码看起来像这样

SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class objBL = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class();  
objBL.ConnectionString = "Provider=sqloledb;server=server;database=databaseName;integrated security=SSPI";  
objBL.ErrorLogFile = "error.xml";  
objBL.KeepIdentity = false;  
objBL.Execute ("schema.xml","data.xml");

我的 xml 看起来像这样:

<?xml version="1.0" encoding="UTF-8"?>
<foo>
   <row>
      <BICYCLE_NUM>624</BICYCLE_NUM>
      <BICYCLE_ORDER>1</BICYCLE_ORDER>      
   </row>
   <row>
      <BICYCLE_NUM>623</BICYCLE_NUM>
      <BICYCLE_ORDER>2</BICYCLE_ORDER>      
   </row>
   <row>
      <BICYCLE_NUM>681</BICYCLE_NUM>
      <BICYCLE_ORDER>3</BICYCLE_ORDER>      
   </row>
   <row>
      <BICYCLE_NUM>625</BICYCLE_NUM>
      <BICYCLE_ORDER>4</BICYCLE_ORDER>      
   </row>
   <row>
      <BICYCLE_NUM>680</BICYCLE_NUM>
      <BICYCLE_ORDER>5</BICYCLE_ORDER>      
   </row>
</foo>

XSD 看起来像这样:

<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
        xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
<xsd:element name="row" sql:relation="BICYCLE"   
                        sql:key-fields="BICYCLE_NUM">  
    <xsd:complexType> 
        <xsd:sequence>
            <xsd:element name="BICYCLE_NUM"   type="xsd:integer" />   
            <xsd:element name="BICYCLE_ORDER"   type="xsd:integer" />  
        </xsd:sequence>
    </xsd:complexType>
</xsd:element>

SQL 表如下所示:

CREATE TABLE BICYCLE (  
         BICYCLE_NUM   INT ,  
         BICYCLE_ORDER INT 
GO  

CREATE UNIQUE NONCLUSTERED INDEX IX_BICYCLE_NUM__BICYCLE_ORDER
   ON Wagon (BICYCLE_NUM, BICYCLE_ORDER);

我试过设置CheckConstraints = true,结果还是一样

SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class objBL = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class
            {
                ConnectionString = connectionString,
                ErrorLogFile = "error.xml",
                KeepIdentity = true,
                CheckConstraints = true
            };

我的问题是如何防止使用 SQLXMLBULKLOADLib 插入重复项?

【问题讨论】:

  • SQLXML 已经很老了,你应该避免在新项目中使用它。
  • @DavidBrowne-Microsoft 感谢您的回复。但是,我们可以使用哪些替代方案?
  • 使用 SqlBulkCopy,或将 XML 发送到 SQL Server 并使用 .nodes() 或 OPENXML 对其进行解析。 docs.microsoft.com/en-us/sql/relational-databases/xml/…
  • @DavidBrowne-Microsoft 如果我们使用SqlBulkCopy,那么我们应该通过C#解析xml文件,然后通过SqlBulkCopy插入解析后的数据?
  • 是的。如果文档非常大,则使用 XDocument 或 XmlReader 和 XDocument 的组合解析 XML。然后加载一个 DataTable,或者如果非常大,实现一个 IDataReader。

标签: c# sql-server xml sqlxml


【解决方案1】:

在探索SQLXMLBulkLoad4Class 之后,找到了IgnoreDuplicateKeys 属性。所以我们可以使用IgnoreDuplicateKeys属性:

SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class objBL = new SQLXMLBULKLOADLib.SQLXMLBulkLoad4Class
{
    ConnectionString = connectionString,
    ErrorLogFile = "error.xml",
    ISQLXMLBulkLoad_IgnoreDuplicateKeys = true,
    IgnoreDuplicateKeys = true
};
objBL.Execute(xsdScheme, xmlFileName);

另外,应该使用CONSTRAINT,而不是UNIQUE NONCLUSTERED INDEX

CREATE TABLE BICYCLE 
(  
      BICYCLE_NUM   INT
    , BICYCLE_ORDER INT
    , CONSTRAINT PK_BICYCLENUM_BICYCLEORDER PRIMARY KEY 
        NONCLUSTERED (BICYCLE_NUM, BICYCLE_ORDER)    
)
GO  

【讨论】:

    猜你喜欢
    • 2012-08-30
    • 2015-08-07
    • 2016-02-19
    • 1970-01-01
    • 1970-01-01
    • 2021-09-25
    • 2018-04-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多