在 .NET 环境中使用 SQLXML 大容量加载

本主题说明如何在 .NET 环境中使用 XML 大容量加载功能。 有关 XML 大容量加载的详细信息,请参阅执行 XML 数据的大容量加载(SQLXML 4.0)。

若要从托管环境使用 SQLXML 大容量加载 COM 对象,需要添加对此对象的项目引用。 这会围绕大容量加载 COM 对象生成托管包装接口。

注释

托管 XML 大容量加载不适用于托管流,并且需要围绕本机流进行包装。 SQLXML 大容量加载组件不会在多线程环境中运行(“[MTAThread]”属性)。 如果尝试在多线程环境中运行大容量加载组件,则会收到 InvalidCastException 异常,其中包含以下附加信息:“SQLXMLBULKLOADLib.ISQLXMLBulkLoad 接口的 QueryInterface 失败。解决方法是使包含大容量加载对象单线程的对象易于访问(例如,使用 [STAThread] 属性,如示例中所示)。

本主题提供一个工作 C# 示例应用程序,用于批量加载数据库中的 XML 数据。 若要创建工作示例,请执行以下步骤:

  1. 创建下表:

    CREATE TABLE Ord (  
             OrderID     int identity(1,1)  PRIMARY KEY,  
             CustomerID  varchar(5))  
    GO  
    CREATE TABLE Product (  
             ProductID   int identity(1,1) PRIMARY KEY,  
             ProductName varchar(20))  
    GO  
    CREATE TABLE OrderDetail (  
           OrderID     int FOREIGN KEY REFERENCES Ord(OrderID),  
           ProductID   int FOREIGN KEY REFERENCES Product(ProductID),  
                       CONSTRAINT OD_key PRIMARY KEY (OrderID, ProductID))  
    GO  
    
  2. 将以下架构保存在文件中(schema.xml):

    <xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"  
                xmlns:sql="urn:schemas-microsoft-com:mapping-schema">  
    <xsd:annotation>  
      <xsd:appinfo>  
        <sql:relationship name="OrderOD"  
              parent="Ord"  
              parent-key="OrderID"  
              child="OrderDetail"  
              child-key="OrderID" />  
    
        <sql:relationship name="ODProduct"  
              parent="OrderDetail"  
              parent-key="ProductID"  
              child="Product"  
              child-key="ProductID"   
              inverse="true"/>  
      </xsd:appinfo>  
    </xsd:annotation>  
    
      <xsd:element name="Order" sql:relation="Ord"   
                                sql:key-fields="OrderID" >  
       <xsd:complexType>  
         <xsd:sequence>  
            <xsd:element name="Product" sql:relation="Product"   
                         sql:key-fields="ProductID"  
                         sql:relationship="OrderOD ODProduct">  
              <xsd:complexType>  
                 <xsd:attribute name="ProductID" type="xsd:int" />  
                 <xsd:attribute name="ProductName" type="xsd:string" />  
              </xsd:complexType>  
            </xsd:element>  
         </xsd:sequence>  
            <xsd:attribute name="OrderID"   type="xsd:integer" />   
            <xsd:attribute name="CustomerID"   type="xsd:string" />  
        </xsd:complexType>  
      </xsd:element>  
    </xsd:schema>  
    
  3. 将以下示例 XML 文档保存在文件中(data.xml):

    <ROOT>    
      <Order OrderID="11" CustomerID="ALFKI">  
        <Product ProductID="11" ProductName="Chai" />  
        <Product ProductID="22" ProductName="Chang" />  
      </Order>  
      <Order OrderID="22" CustomerID="ANATR">  
         <Product ProductID="33" ProductName="Aniseed Syrup" />  
        <Product ProductID="44" ProductName="Gumbo Mix" />  
      </Order>  
    </ROOT>  
    
  4. 启动 Visual Studio。

  5. 创建 C# 控制台应用程序。

  6. 在“ 项目 ”菜单中,选择“ 添加引用”。

  7. COM 选项卡中,选择 Microsoft SQLXML 大容量加载 4.0 类型库 (xblkld4.dll),然后单击“ 确定”。 你将看到在项目中创建的 Interop.SQLXMLBULKLOADLib 程序集。

  8. 将 Main() 方法替换为以下代码。 更新 ConnectionString 属性和架构和数据文件的文件路径。

    [STAThread]  
       static void Main(string[] args)  
       {     
             try  
             {  
                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");  
             }  
             catch(Exception e)  
             {  
             Console.WriteLine(e.ToString());  
             }  
       }  
    
  9. 若要在创建的表中加载 XML,请生成并运行项目。

    注释

    也可以使用作为 .NET Framework 的一部分提供的 tlbimp.exe 工具添加对大容量加载组件的引用(xblkld4.dll)。 此工具为本机 DLL(xblkld4.dll)创建托管包装器,然后可在任何 .NET 项目中使用它。 例如:

    c:\>tlbimp xblkld4.dll  
    

    这会创建可在 .NET Framework 项目中使用的托管包装 DLL(SQLXMLBULKLOADLib.dll)。 在 .NET Framework 中,将项目引用添加到新创建的 DLL。

另请参阅

执行 XML 数据的大容量加载(SQLXML 4.0)