передача данных в виде поля из Oracle в .NET - PullRequest
1 голос
/ 21 января 2009

В .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 ]

1 голос
/ 21 января 2009

Мне нужно было сделать что-то похожее один раз, и в итоге я возвращал их все как OUT REF CURSOR, по одному для каждого набора результатов. Это может быть загружено в DataSet при желании.

1 голос
/ 21 января 2009

Хотя тип, как вы говорите, Object, .Net пытается использовать более строго типизированные значения. Столбцы имеют связанное свойство DataType, которое поддерживает только меньший набор типов. Смотрите эту ссылку для полного списка:
http://msdn.microsoft.com/en-us/library/system.data.datacolumn.datatype.aspx

Поскольку datatable - это xml под капотом, вы, вероятно, могли бы создать такую ​​таблицу, но .Net не будет передавать ее в базу данных. Вместо этого вы должны изучить использование DataSet. DataSet - это просто набор DataTables, но он также поддерживает схему, которая может отображать отношения так, как вам нужно.

0 голосов
/ 25 марта 2009

Я задал этот вопрос относительно давно (пару месяцев назад), а затем, когда я не получил ответ, который работал на меня, я вернулся к отправке нескольких таблиц данных и «повторной сборке» их на стороне приложения. так, как это должно быть обработано. Однако я нашел ответ на этот вопрос и должен был поделиться им с сообществом здесь. Поддержка Oracle для XML, начиная с версии 9, абсолютно невероятна, и, в частности, пакет 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 в строку и перейдите в 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 есть еще много всего, кроме этой очень крутой функции. Это определенно стоит проверить.

...