Проблема множественных оракулов - PullRequest
3 голосов
/ 14 июля 2011

Я пытаюсь выполнить запрос со страницы .NET, но у меня, похоже, возникают проблемы с несколькими запросами.

Мой запрос похож на этот

SELECT * FROM table1; SELECT * from table2

Но я, кажется, получаю ошибку недопустимого символа при выполнении этого со страницы .Net.Он прекрасно работает в SQL-разработчике, но завершается сбоем только тогда, когда я помещаю его на свою страницу .NET.

Я добавил BEGIN и END к запросу, так как некоторые веб-сайты предполагают, что это нужно для запуска несколькихзапросов, но затем я получаю следующую ошибку

ORA-06550: строка 1, столбец 7: PLS-00428: в этом операторе SELECT ожидается предложение INTO

CanКто-нибудь пролил свет на это?

Заранее спасибо!

РЕДАКТИРОВАТЬ

Вот код

        query = conn.CreateCommand()

        query.CommandText = "SELECT * from table1; SELECT * FROM table2;"

        DataSet = New DataSet()
        DataAdapter = New DataAdapter(query)
        DataAdapter.Fill(DataSet)

        datagrid1.DataSource = DataSet.Tables(0)
        datagrid1.DataBind()

        lbl1.Text = DataSet.Tables(1).Rows(0).Item("column1").ToString()

Ответы [ 4 ]

3 голосов
/ 14 июля 2011

Если вы хотите извлечь из 2 таблиц и получить набор данных, который вы можете заполнить в DataAdapter, то вам нужно использовать один из следующих подходов:

  1. объединить 2 таблицы вместе (может или не может быть в зависимости от ваших таблиц)
  2. объединение двух таблиц (это может или не может быть применимо к вашему сценарию)
  3. написать хранимую процедуру, которая создает любой нужный вам результат и возвращает его в виде курсора ссылки. Вы можете прочитать о том, как это сделать здесь .

Вы не сможете просто запустить 2 таких оператора SQL и получить какой-либо значимый результат в DataSet.

0 голосов
/ 14 июля 2011

Возможное решение может быть

query.CommandText = "BEGIN OPEN :1 FOR SELECT * FROM table1; OPEN :2 FOR SELECT * FROM table2; END;"; 

... как указано в DataSet.Load: загрузка нескольких таблиц с помощью System.Data.OracleClient.OracleDataReader ... но не провереносебя.

Также проверьте http://forums.asp.net/t/629511.aspx/1. Это показывает, как, вроде.Я добавил ссылку на Oracle.DataAccess.Types ;, но проблема все еще была.Это близко, хотя.

0 голосов
/ 14 июля 2011

Если вам нужны только поля, присутствующие как в таблице1, так и в таблице2, вы можете сделать

SELECT field1, field2, field3 FROM table1
UNION
SELECT field1, field2, field3 FROM table2

Если поля имеют разные имена, но одинаковый тип содержимого, вы можете сделать

SELECT tab1_id AS primary_key, tab1_name AS name, tab1_amount AS amount FROM table1
UNION
SELECT tab2_id AS primary_key, tab2_name AS name, tab2_amount AS amount FROM table2

Это даст вам результат со столбцами primary_key, name, amount (это просто случайный пример)

Если две таблицы содержат совершенно разное содержимое, вам действительно следует использовать два отдельных запроса.

0 голосов
/ 14 июля 2011

Извините за утверждение очевидного, но:

1 .. Сделайте 2 вызова

или

2 .. Поместите выборки в хранимую процедуру и верните 2 рекурсора

вот хорошая ссылка по работе с несколькими наборами результатов: http://msdn.microsoft.com/en-us/library/ms971506.aspx#msdnorsps_topic13

...