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

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

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

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

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

Там вообще различные типы данных рассматриваются - так что в путь и с песней - ничего сложного, только лучше установить клиента Оракл под нет...
...
Рейтинг: 0 / 0
15.10.2004, 16:25
    #32740857
Serg****
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PROCEDURE "C# + ORACLE"
Зайди на форум по Oracle и узнай как получить курсор вызывая хранимую процедуру.
...
Рейтинг: 0 / 0
15.10.2004, 16:26
    #32740864
кузя
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PROCEDURE "C# + ORACLE"
посмотри ещё и по этой ссылке
How To Use a DataReader Against an Oracle Stored Procedure in Visual C# .NET
возможно, поможет
...
Рейтинг: 0 / 0
18.10.2004, 16:20
    #32742985
mayton
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PROCEDURE "C# + ORACLE"
Совсем недавно и я столкнулся с этой проблемой. Два дня копания по протоколам 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
18.10.2004, 17:52
    #32743251
Hummer
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PROCEDURE "C# + ORACLE"
2 mayton
Ну и что?:)
Решения были даны мной в ссылке выше.
Выходные параметры нет проблем получать - а отличия в наборахх данных очень существенны между сиквельным и оракловым клиентами.

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


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