2009-01-21 55 views
1

在.NET Datatable中,列是對象類型,它可以將數據表包含爲列的有效類型。所以,你可以創建一個相當複雜的結構:將數據表作爲字段從Oracle傳遞到.NET

CompanyID (Integer) | CompanyName (String) | OrderRecords (DataTable) 
--------------------------------------------------------------------------- 
1     | Acme Corp.   | DataTable of Orders 

當調用Oracle存儲過程,有沒有辦法回到這樣的結構。我嘗試使用內聯視圖,但它不會讓我。例如:

refCursor IS ref CURSOR; 

PROCEDURE GETCOMPANYLIST (
    CompanyCursor OUT refCursor 
) 
AS 
BEGIN 
Open CompanyCursor For 
SELECT COMPANYID, COMPANYNAME, 
    (SELECT * FROM ORDERS WHERE CompanyID = CompanyID) OrderRecords 
    WHERE IsActive = 'T'; 
END GETCOMPANYLIST; 

這是不行的,但有沒有辦法做什麼,我想在這裏做什麼? 目前,我必須在一次調用數據庫的情況下取回公司名單,然後遍歷所有記錄並進行單個調用以獲取每個訂單列表。

[增加了有效的答案 - 到現在爲止沒有回答居然回答的問題]

回答

1

我需要做一次類似的事情,最後將它們全部作爲OUT REF CURSOR返回,每個結果集一個。 如果您喜歡,可以將其加載到DataSet中。

+0

這正是我要去的地方。到目前爲止它不能正常工作,但幾乎在那裏。 – stephenbayer 2009-01-21 17:58:37

1

雖然類型爲Object像你說的,淨不嘗試使用更多的強類型值。這些列具有關聯的DataType屬性,僅支持較小的一組類型。請參閱此鏈接的完整列表:
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

由於數據表是引擎蓋下的XML你也許可以建立一個這樣的表,但淨不會把它傳遞到數據庫。相反,你應該考慮使用DataSet。 DataSet只是DataTable的一個集合,但它也支持可以根據需要映射關係的模式。

+0

這是真的,但我與只有一個DataTable作爲參數的方法接口,所以我不能不幸的是,我把它作爲一個數據集傳遞給我從適配器創建數據集,使用多個選擇遊標,然後在數據層拼湊在一起。 – stephenbayer 2009-01-21 17:57:58

0

在很久以前(幾個月前)我問過這個問題,然後當我沒有得到一個適合我的響應時,我回到發送多個數據表並在應用程序端「重新組裝」它們它需要處理的方式。但是,我找到了這個問題的答案,並且在這裏與社區分享。自從版本9以來,Oracle對XML的支持是絕對不可思議的,特別是DBMS_XMLQuery包可以用來解析我上面列出的問題,解析併發送select語句作爲XML數據集,該數據集可以在.NET應用程序端輕鬆轉換。毫不費力。下面是從測試存儲過程我最近寫的示例代碼:

SELECT COMPANYID, COMPANYNAME, 
    DBMS_XMLQuery.GetXML(
    'SELECT * FROM ORDERS WHERE CompanyID = ' 
    || COMPANY.COMPANYID) 
    OrderRecords 
    FROM COMPANY 
    WHERE lower(COMPANYNAME) LIKE '%shawn%'; 

這將返回類似如下(只要把OrderRecords在爲一個字符串,隱蔽到數據表:

CompanyID | CompanyName  | OrderRecords 
--------------------------------------------------------------------------- 
1051  | Shawns Company | XML String Returned, listed below 

<?xml version = '1.0'?> 
<ROWSET> 
    <ROW num="1"> 
     <ORDERID>500020</ORDERID> 
     <NOTES>Test Note</NOTES> 
     <!-- Additional fields cut out Not necessary for example --> 
    </ROW> 
    <ROW num="2"> 
     <ORDERID>500021</ORDERID> 
     <NOTES>Test Note 2</NOTES> 
     <!-- Additional fields cut out Not necessary for example --> 
    </ROW> 
    <ROW num="3"> 
     <ORDERID>500280</ORDERID> 
     <NOTES>notes test</NOTES> 
     <!-- Additional fields cut out Not necessary for example --> 
    </ROW> 
    <!-- Additional Rows cut out Not necessary for example --> 
</ROWSET> 

有除了這一個非常酷的功能外,還有很多DBMS_XMLQuery包,它絕對值得一試。

相關問題