2010-04-26 61 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

相關問題