2013-08-30 26 views
0

使用C#.NET检查PK在XML文件是数据库

类似于PK我已经从SQL Server数据库,导出表到XML文件的程序。 然后我将更改XML文件并将其导回到数据库。

我正在处理的新程序将检查我的XML文件并将其与数据库上的同一个表进行比较。如果XML文件上的主键与DB上的主键相同,则它将删除XML文件中的行,其余具有不同PK的行将被导入。

我正在使用SqlBulkCopy将表格从XML导入数据库。 问题是我不知道如何从XML中获取主键并将其与数据库上的主键进行比较。

示例XML结构:

<NewDataSet> 
    <Table> 
     <DeviceId>1</DeviceId> 
     <DeviceTypeId>1</DeviceTypeId> 
     <Disabled>false</Disabled> 
    </Table> 
</NewDataSet> 
+0

后的XML相似的XML结构,你到目前为止 – DGibbs

+0

1 假试了一下
XML可能看起来像这样,其中DeviceTypeId可能是PK。我曾尝试使用“DataTable.PrimaryKey属性”。但我只是没有得到工作。我不知道我应该如何从XML和数据库中获取主键的值 –

+0

谢谢,您需要查看[Linq to XML](http://msdn.microsoft.com/zh-cn/library/bb387098 .aspx) - 请参阅我的答案以获得更多信息 – DGibbs

回答

0

假设的XML结构:

<NewDataSet> 
    <Table> 
    <DeviceId>1</DeviceId> 
    <DeviceTypeId>1</DeviceTypeId> 
    <Disabled>false</Disabled> 
    </Table> 
</NewDataSet> 

你可以使用一个简单的LINQ to XML查询从XML获得DeviceId(PK):

var id = (from n in xml.Root.Elements("Table") 
      select n.Element("DeviceId").Value).SingleOrDefault(); 

退货:1

编辑*如果每个表都有的PK不同的列名,那么就需要重写本或编写特定的每个表的数据访问代码:

public static int GetTablePK(string identifier) 
{ 
    return Convert.ToInt32((from n in xml.Root.Elements("Table") 
      select n.Element(indentifier).Value).SingleOrDefault()); 
} 

哪里identifier是PK的名字。这不承担表

+0

嗯,即时通讯循环了1000多个表格。是否有可能没有手动写入主键? –

+0

'是否有可能无需手动写入主键?' - 什么? – DGibbs

+0

好吧,现在您选择“deviceId”作为元素。因为你知道它是主键,但是如果你有1000个表格。你没有时间写每个PrimaryKey元素。 –