Предотвратить дублирование при вставке с помощью SQLXMLBULKLOADLib - PullRequest
0 голосов
/ 16 февраля 2020

Мне интересно, есть ли способ предотвратить вставку дублирующихся строк при использовании 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?

1 Ответ

0 голосов
/ 16 февраля 2020

После изучения 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  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...