Страница: 1 |
Страница: 1 |
Вопрос: В чем ошибка/разница (Oracle Data Provider.NET)
Добавлено: 02.07.07 10:53
Автор вопроса: Shota
Люди у меня VS2005
соответственно доступ к данным через ADO.2.0.
там есть библиотека классов от Microsoft: system.data.oracleclient.
кроме того я с сайта Oracle скачал библиотеку:
ODP.NET ( OracleDataProvider For .NET )
вроде есть плюсы ( по сравнению с Microsoft ) НО!!!
почему возникают проблемы с вызовом функций сервера не понимаю ( проблема как я подозреваю с типами данных )
для иллюстрации сказанного привожу пример где с Microsoft-овским провайдером все нормально работает
а точно такой же код ( с единственным отличием ) но с ODP.NET не работает, на всякий случай код содания функции на сервере тоже выкладываю.
1 код содания функции:
CREATE OR REPLACE PACKAGE SHOTA.MyPackage AS
FUNCTION MyFunction1(Param1 IN varchar2) RETURN varchar2;
END MyPackage;
/
CREATE OR REPLACE PACKAGE BODY SHOTA.MyPackage AS
FUNCTION MyFunction1(Param1 IN varchar2) RETURN varchar2 IS
Temp varchar2(100);
BEGIN
Temp := 'My function ' || Param1;
RETURN Temp;
END MyFunction1;
END MyPackage;
/
2 сама программа ( консольное приложение )
к проекту надо подключить ссылки на
Oracle.DataAccess
System.Data.OracleClient
' add reference to [Oracle.DataAccess]
' add reference to [System.Data.OracleClient]
Module Module1
Private Const cnnString = "Data Source=test;User ID=shota;Password=shota"
Sub Main()
Console.WriteLine("----------begin--------------")
' следующая процедура работает на ура
Console.WriteLine("Microsoft")
executeMS()
' а вот эта выдает ошибки
Console.WriteLine("Oracle")
executeOra()
Console.WriteLine("-----------end--------------")
Console.ReadLine()
End Sub
Private Sub executeMS()
Dim cnn As New System.Data.OracleClient.OracleConnection
Dim cmd As New System.Data.OracleClient.OracleCommand
Dim prm1 As New System.Data.OracleClient.OracleParameter
Dim prm2 As New System.Data.OracleClient.OracleParameter
' connection
cnn.ConnectionString = cnnString
Try
cnn.Open()
Catch ex As Exception
Console.WriteLine(ex.Message)
Exit Sub
End Try
' command
With cmd
.Connection = cnn
.CommandType = CommandType.StoredProcedure
.CommandText = "shota.MyPackage.MyFunction1"
End With
' parameters
With prm1
.ParameterName = "Param1"
.Direction = ParameterDirection.Input
.OracleType = OracleClient.OracleType.VarChar
.Size = 50
.Value = "some text here"
End With
cmd.Parameters.Add(prm1)
With prm2
.ParameterName = "Result"
.Direction = ParameterDirection.ReturnValue
.OracleType = OracleClient.OracleType.VarChar
.Size = 100
End With
cmd.Parameters.Add(prm2)
' execute
Try
cmd.ExecuteNonQuery()
Catch ex As System.Data.OracleClient.OracleException
Console.WriteLine(ex.ToString)
Exit Sub
End Try
' show result
Console.WriteLine("Function return: " + cmd.Parameters("Result").Value.ToString)
End Sub
Private Sub executeOra()
Dim cnn As New Oracle.DataAccess.Client.OracleConnection
Dim cmd As New Oracle.DataAccess.Client.OracleCommand
Dim prm1 As New Oracle.DataAccess.Client.OracleParameter
Dim prm2 As New Oracle.DataAccess.Client.OracleParameter
' connection
cnn.ConnectionString = cnnString
Try
cnn.Open()
Catch ex As Exception
Console.WriteLine(ex.Message)
Exit Sub
End Try
' command
With cmd
.Connection = cnn
.CommandType = CommandType.StoredProcedure
.CommandText = "shota.MyPackage.MyFunction1"
End With
' parameters
With prm1
.ParameterName = "Param1"
.Direction = ParameterDirection.Input
' это единственная строчка отличная от Microsoft-провайдера
.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
.Size = 50
.Value = "some text here"
End With
cmd.Parameters.Add(prm1)
With prm2
.ParameterName = "Result"
.Direction = ParameterDirection.ReturnValue
' это единственная строчка отличная от Microsoft-провайдера
.OracleDbType = Oracle.DataAccess.Client.OracleDbType.Varchar2
.Size = 100
End With
cmd.Parameters.Add(prm2)
' execute
Try
cmd.ExecuteNonQuery()
Catch ex As Oracle.DataAccess.Client.OracleException
Console.WriteLine(ex.ToString)
Exit Sub
End Try
' show result
Console.WriteLine("Function return: " + cmd.Parameters("Result").Value.ToString)
End Sub
End Module
Ответы
Всего ответов: 5
Номер ответа: 1
Автор ответа:
BG(Алексей)
Вопросов: 26
Ответов: 295
Профиль | | #1
Добавлено: 03.07.07 04:17
Тоо Much for me
Номер ответа: 2
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #2
Добавлено: 01.09.07 10:30
отвлечённый вопрос - а почему ты нигде не вызываешь dispose?
Номер ответа: 3
Автор ответа:
Neco
ICQ: 247906854
Вопросов: 133
Ответов: 882
Web-сайт:
Профиль | | #3
Добавлено: 01.09.07 10:37
ты б хоть написал, что за проблемы - не у всех есть ODP и БД на оракле (неизвестной версии, как у тебя) под рукой, чтоб твой код запустить.
по теме: я вызов процедур по незнанию возможностей OracleCommand делал так: commandtext = "begin man.my_proc(:my_param) end;/" (насчёт концовки не точно помню). Попробуй - может получится.
не по теме: а ODP - штука бесплатная?
Номер ответа: 4
Автор ответа:
Shota
Вопросов: 22
Ответов: 52
Профиль | | #4
Добавлено: 10.09.07 17:11
1. ODP.NET можно бесплатно скачать с сайта Oracle:
http://www.oracle.com/technology/tech/windows/odpnet/index.html
2. Версия оракла: 10.2
3. Я разобрался в чем разница в вызовах процедур/функций в АДО и ОДП: АДО поддерживает "именованные" параметры а ОДП не поддерживает!!! поясню на примере -
допустим есть процедура на сервере:
my_proc( param1, param2)
вызвать ее из АДО можно добавив 2 параметра к объекту команды и назвав эти параметры "param1" и "param2", не важно в какой последовательности, АДО само разберется какой параметр где. В противоположность к АДО, ОДП чихать на наименования параметров, для ОДП важна последовательность добавления параметров в коллекцию cmd.parameters.......... вот и все.
Номер ответа: 5
Автор ответа:
Shota
Вопросов: 22
Ответов: 52
Профиль | | #5
Добавлено: 10.09.07 17:16
пусть framework думает у него голова большая
на самом деле ведь все переменные локальные.....
хотя может я не прав..... 100% но не скажу.....