Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - .NET

Страница: 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-сайт: neco.pisem.net
 Профиль | | #2
Добавлено: 01.09.07 10:30
отвлечённый вопрос - а почему ты нигде не вызываешь dispose?

Ответить

Номер ответа: 3
Автор ответа:
 Neco



ICQ: 247906854 

Вопросов: 133
Ответов: 882
 Web-сайт: neco.pisem.net
 Профиль | | #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% но не скажу.....

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам