将数据表作为字段从Oracle传递到.NET

时间:2009-01-21 17:15:53

标签: .net oracle datatable dataset

在.NET Datatable中,列是对象类型,可以包含数据表作为列的有效类型。所以你可以创建一个相当复杂的结构:

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;

这不起作用,但有什么方法可以做我想在这里做的事情? 目前,我必须在一次调用数据库时返回公司列表,然后遍历所有记录并进行单独调用以获取每个订单列表。

[添加了有效的答案 - 直到现在还没有回答实际问题的答案]

3 个答案:

答案 0 :(得分:1)

虽然您所说的类型为Object,但.Net确实尝试使用更强类型的值。这些列具有关联的DataType属性,该属性仅支持较小的一组类型。有关完整列表,请参阅此链接:
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

由于数据表是xml,你可能可以构建一个这样的表,但.Net不会将它传递给数据库。相反,您应该考虑使用DataSet。 DataSet只是DataTables的集合,但它也支持可以根据需要映射关系的模式。

答案 1 :(得分:1)

我需要做一次类似的事情,并最终将它们全部作为OUT REF CURSOR返回,每个结果集一个。 如果愿意,可以将其加载到DataSet中。

答案 2 :(得分:0)

我在很久以前(几个月前)问过这个问题,然后当我没有得到对我有用的回复时,我回去发送多个数据表并在应用程序端“重新组装”它们需要处理的方式。但是,我找到了这个问题的答案,并且不得不在这里与社区分享。从版本9开始,Oracle对XML的支持是绝对令人难以置信的,特别是DBMS_XMLQuery包可以用来解决上面列出的问题,方法是将select语句解析并作为XML数据集发送回来,可以通过.NET在Application端轻松转换。毫不费力。以下是我最近编写的测试存储过程中的示例代码:

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

这将返回类似下面的内容(只需将OrderRecords作为字符串拉入并转换为DataTable:

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包还有很多其他功能。绝对值得一试。