2010-04-26 60 views
3

目前我正在处理一个我们不想在c#/ wpf程序中改变太多,但想添加一个功能的案例。目前,我们允许某些用户将sql查询添加到数据库以检索客户数据,因此必须指定自定义连接字符串/提供程序名称。有了这些信息,就可以创建连接并使用c#获取数据。是否可以使用SQL查询XML文件?

但是,我们希望增加允许该用户组查询XML文件的可能性,以及特定的连接字符串/提供程序名称。我只是在.net中寻找可能性来做到这一点,但似乎无法找到一个体面的方式...是这样的可能吗? (OleDb/ODBC的方式可能?)

编辑:为了清楚起见,我想说的是,解决方案必须能够适应连接数据源与指定的连接字符串,与指定的提供商和执行SQL查询。

edit2:在回顾前三个答案后,我决定看看超越XML。这篇文章似乎说明了上述情况是最好的(唯一的区别是用XLS代替XML):How to query excel file in C# using a detailed query。 XML的可能解决方案仍然欢迎...

在此先感谢。

回答

0

许多XML库允许XPath查询到针对XML文档发出,但语法是SQL非常不同的语义有很大的不同。另外,XPath并不真正以SQL的方式生成结果集 - 它返回XML文档的一部分或字段的内容。我想说,如果应用程序的其余部分面向SQL结果集,则可能会遇到显着的阻抗不匹配。

虽然还有另外一种语言(XQuery),但XPath也比SQL要笨得多。但是,在XML解析库中,良好的XQuery支持非常少见。 XQuery与SQL的工作方式截然不同,因此您的用户可能无法理解它。

许多DBMS平台(包括SQL Server),也有支持在SQL查询中嵌入的XPath表达式原生XML数据类型。使用CROSS APPLY,您可以执行连接操作,将分层数据结构平铺到SQL结果集中。但是,这非常复杂,您的用户可能无法正常工作。

总之,我认为增加这类设备来查询XML文档可能不会很好地工作。

一个选择是建立一个设施,撕碎XML文档和内容填充到具有相同的结构,你的应用程序的数据库。这是相当直接的实施,并不需要你的用户学习新的范例。

+0

我认为你在破解XML文档方面的解决方案将是最好的...但是它确实需要源代码实现。所以我们仍然希望有一个'连接到查询xml'的解决方案,但是如果不这样做,那么猜测这将是最好的! – 2010-04-26 10:09:24

4

是的。使用Linq2Xml

http://www.hookedonlinq.com/LINQtoXML5MinuteOverview.ashx

http://www.liquidcognition.com/tech-tidbits/linq2xml-example.aspx

// Loading from a file, you can also load from a stream 
XDocument loaded = XDocument.Load(@"C:\contacts.xml"); 


// Query the data and write out a subset of contacts 
var q = from c in loaded.Descendants("contact") 
     where (int)c.Attribute("contactId") < 4 
     select (string)c.Element("firstName") + “ “ + 
     (string)c.Element("lastName"); 


foreach (string name in q) 
    Console.WriteLine("Customer name = {0}", name); 
+0

我不明白如何使用Linq等同于使用SQL查询XML。 – spender 2010-04-26 08:59:04

+0

它并不等同,但确实达到了相同的目的。 – 2010-04-26 09:01:39

+0

确实是一种很好的方式,但对于这种情况,我们希望通过指定另一个连接字符串/提供程序名称来解决此问题。这样,源代码不必被改变。仅供参考:所选用户将其查询/连接字符串/提供程序保存到数据库,并在应用程序中执行查询时再次请求该信息。 – 2010-04-26 09:02:54

-1

Linq就像语言.NET,使您可以编写SQL语句的风格查询很多东西的SQL。它特别允许您为XML文档执行此操作。

这个article对Linq to XML有很好的概述。

这里是它的外观/为例作品

var q = from c in xmlSource.contact 
     where c.contactId < 4 
     select c.firstName + " " + c.lastName; 
+0

这不是它如何寻找* *只是LINQ到XML,当然...如果你刚刚获得XElement或XDocument等,则需要Elements,Descendants等。 – 2010-04-26 09:02:30

+0

Ofc。这只是LINQ“看上去”的一个例子...... – Chris 2010-04-26 09:10:01

相关问题