powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / PROCEDURE "C# + ORACLE"
6 сообщений из 6, страница 1 из 1
PROCEDURE "C# + ORACLE"
    #32740818
Павел_111
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Работая с "MSQL + C#" чтобы не хранить запрос в программе, делал его в виде хранимой процедуры на сервере, например:

CREATE PROCEDURE GetCustomer(@CustomerID int) AS
SELECT CustomerID, Company FROM Customers
WHERE CustomerID = @CustomerID
RETURN

И в программе считывал данные с помощю DataReader .....

Но вот облом на ORACLE такая штука не проходит, он не может так возвращать набор результатов из вызова хранимой процедуры.

ПЛИЗ подскажите какие есть варианты, не хочется держать все запросыв программе .....
...
Рейтинг: 0 / 0
PROCEDURE "C# + ORACLE"
    #32740852
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Смотрим в сторону ref-cursor.
Общение с Оракл - подробности тут .

Там вообще различные типы данных рассматриваются - так что в путь и с песней - ничего сложного, только лучше установить клиента Оракл под нет...
...
Рейтинг: 0 / 0
PROCEDURE "C# + ORACLE"
    #32740857
Serg****
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зайди на форум по Oracle и узнай как получить курсор вызывая хранимую процедуру.
...
Рейтинг: 0 / 0
PROCEDURE "C# + ORACLE"
    #32740864
кузя
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
посмотри ещё и по этой ссылке
How To Use a DataReader Against an Oracle Stored Procedure in Visual C# .NET
возможно, поможет
...
Рейтинг: 0 / 0
PROCEDURE "C# + ORACLE"
    #32742985
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совсем недавно и я столкнулся с этой проблемой. Два дня копания по протоколам OracleClient.dll принесли результаты.
Предполагаю что ты используешь System.Data.OracleClient.dll (а не OleDB) и соединение уже установлено через обьект
Conn.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
// Вызов процедуры Test3() c возвратом двух параметров (типа varchar2 и number)
//  -------------------------------------------------- 
// procedure test3(arg1 out varchar2,arg2 out number);
//  -------------------------------------------------- 
public static void GoTEST3(OracleConnection Conn)
{
	OracleCommand Comm=new OracleCommand("test.test3",Conn);
	Comm.CommandType=CommandType.StoredProcedure;		

	Comm.Parameters.Add(new OracleParameter("arg1",OracleType.VarChar, 255 ,ParameterDirection.Output,true, 0 , 0 ,"",DataRowVersion.Current,""));
	Comm.Parameters.Add(new OracleParameter("arg2",OracleType.Number, 38 ,ParameterDirection.Output,true, 0 , 0 ,"",DataRowVersion.Current, 0 ));			

	Console.WriteLine(Comm.CommandText);
	int res=Comm.ExecuteNonQuery();			
	Console.WriteLine("---------- Return parameters: ---------------------");
	IEnumerator Ie=Comm.Parameters.GetEnumerator();
	while(Ie.MoveNext())
	{
		Console.WriteLine("ParameterName = {0}",((OracleParameter)Ie.Current).ParameterName);
		Console.WriteLine("Value = {0}",((OracleParameter)Ie.Current).Value);
		Console.WriteLine("DbType = {0}",((OracleParameter)Ie.Current).DbType);
		Console.WriteLine("OracleType = {0}",((OracleParameter)Ie.Current).OracleType);
		Console.WriteLine("Direction = {0}",((OracleParameter)Ie.Current).Direction);			
		Console.WriteLine("Precision = {0}",((OracleParameter)Ie.Current).Precision);
		Console.WriteLine("Scale = {0}",((OracleParameter)Ie.Current).Scale);
		Console.WriteLine("Offset = {0}",((OracleParameter)Ie.Current).Offset);
		Console.WriteLine("Size = {0}",((OracleParameter)Ie.Current).Size);
		Console.WriteLine("SourceColumn = {0}",((OracleParameter)Ie.Current).SourceColumn);
		Console.WriteLine("SourceVersion = {0}",((OracleParameter)Ie.Current).SourceVersion);
		Console.WriteLine("");				
	}
	Console.WriteLine("---------------------------------------------------");
	Console.WriteLine("res = {0}",res);
}		

Цифру 255 я взял наобум. Предполагается что результирующая строка будет не более чем 255 симв.
Если параметров не много то OracleParameter на выходе можно получить через индексатор []

Код: plaintext
1.
2.
3.
4.
5.
6.
Console.WriteLine("arg1.ParameterName = {0}",Comm.Parameters["arg1"].ParameterName);
Console.WriteLine("arg1.Value = {0}",Comm.Parameters["arg1"].Value);
Console.WriteLine("arg1.DbType = {0}",Comm.Parameters["arg1"].DbType);
Console.WriteLine("arg1.OracleType = {0}",Comm.Parameters["arg1"].OracleType);
Console.WriteLine("arg1.Direction = {0}",Comm.Parameters["arg1"].Direction);			
Console.WriteLine("res = {0}",res);
...
Рейтинг: 0 / 0
PROCEDURE "C# + ORACLE"
    #32743251
Hummer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 mayton
Ну и что?:)
Решения были даны мной в ссылке выше.
Выходные параметры нет проблем получать - а отличия в наборахх данных очень существенны между сиквельным и оракловым клиентами.

Да, на это ушло 2 дня?:)
...
Рейтинг: 0 / 0
6 сообщений из 6, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / PROCEDURE "C# + ORACLE"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]