如何在c#.net 4.0中有效地将XML数据以及关系插入到多个表中?

如何在c#.net 4.0中有效地将XML数据以及关系插入到多个表中?,xml,sql-server-2008,c#-4.0,Xml,Sql Server 2008,C# 4.0,我有一个XML文件,它几乎没有类似类型的节点。每个节点中都有子节点。要求是我需要将主节点的数据插入到一个特定的表中,并将它的每个子表数据插入到一个特定的子表中,外键设置为第一次插入的主键。XML看起来像下面的示例 <XML> <Provider> <providerID>1</ProviderID> . .

我有一个XML文件,它几乎没有类似类型的节点。每个节点中都有子节点。要求是我需要将主节点的数据插入到一个特定的表中,并将它的每个子表数据插入到一个特定的子表中,外键设置为第一次插入的主键。XML看起来像下面的示例

       <XML>
          <Provider>
              <providerID>1</ProviderID>
              .
              .
              .
              <ContactInfo>
                 <Address>address1</Address>
                 .
                 .
              </ContactInfo>                  
          </Provider>
           <Provider>
              <providerID>2</ProviderID>
              .
              .
              .
              <ContactInfo>
                 <Address>Address2</Address>
                 .
                 .
              </ContactInfo>                 
          </Provider>   

1.
.
.
.
地址1
.
.
2.
.
.
.
地址2
.
.
确切的要求是,我需要先将提供商数据插入表1,然后我需要将每个提供商内的联系人信息插入表2以及表1的PK作为表2的FK

如何在c#.net中有效地实现这一点,避免复杂的循环?请任何人帮我做这个

Declare @xml xml
Set @xml = 
'<XML>
<Provider>
    <providerID>1</providerID>
    <ContactInfo>
        <Address>address1</Address>
    </ContactInfo>                  
</Provider>

<Provider>
    <providerID>2</providerID>
    <ContactInfo>
        <Address>address2</Address>
    </ContactInfo>                  
</Provider>

</XML>'

嗯。现在您已经获得了从xml中提取数据的查询。首先将所有这些记录插入到临时表中

完成后,插入到第一个表中。完成?现在插入连接记录(连接第一个表和临时表以从第一个表中获取主键值)


最后,将第二个临时表插入第二个表。

似乎
xml
应该有提供者标记,而不是Provider1、Provider2、Provider3……?@RG1是的,您是对的,我已经相应地更新了代码。现在,请注意这一点。如果需要将主键作为外键引用插入到第二个表中,如何使用上述sql语句执行对第一个表的插入?谢谢,它可以工作。。但我的主要问题是将xml从ADO.NET传递到存储过程。它应作为字符串传递,参数类型应为SqlDbType.Xml。代码如下,XmlDocument xmlDocObj=new XmlDocument();Load(“test.xml的路径”);字符串xmlString=xmlDocObj.InnerXml;使用(SqlConnection connection=newsqlconnection(“连接字符串”))使用(SqlCommand command=newsqlcommand(“sp_InsertXml”,connection)){command.CommandType=CommandType.StoredProcedure;command.Parameters.Add(“@XmlString”,SqlDbType.Xml”)。Value=XmlString;connection.Open();command.ExecuteNonQuery();}
Select 
X.T.value('(providerID)[1]', 'int'),
X.T.value('(ContactInfo/Address)[1]', 'varchar(100)')
From @xml.nodes('/XML/Provider') as X(T)