【问题标题】:passing a datatable as a field from Oracle to .NET将数据表作为字段从 Oracle 传递到 .NET
【发布时间】:2010-10-02 17:50:19
【问题描述】:

在 .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;

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

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

【问题讨论】:

    标签: .net oracle datatable dataset


    【解决方案1】:

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

    【讨论】:

    • 这正是我要去的地方。到目前为止它不能正常工作,但它几乎就在那里。
    • 有效!我想到了。但你的建议正是我所做的。
    【解决方案2】:

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

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

    【讨论】:

    • 这是真的,但我正在与一个仅将 DataTable 作为参数除外的方法进行交互,因此很遗憾,我无法将其作为数据集传递。不过,我几乎得到了它。我正在从适配器创建数据集,使用多个选择光标,然后在数据层中拼凑在一起。
    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2015-06-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-28
      • 2020-08-02
      • 1970-01-01
      相关资源
      最近更新 更多