none
Chamada e passagem de parametros de uma Procedure em Oracle no .NET C# RRS feed

  • Pergunta

  • Olá galera, estou migrando uma aplicação .NET C# com Banco de Dados SQL Server 2005 para Oracle, já migrei toda base de dados, conteúdo e as procedures, mas não sei se a chamada na aplicação passando os parametros para a procedure está certo.

    O cara que desenvolveu a maior parte da aplicação que está .NET C#, desenvolveu em camadas, e utiliza uma factory da Microsoft que te possibilita trabalhar com N bancos, onde na Camada DAL, na função onde chamo a proc e passo os parametros, defino através de 

    Database db = DatabaseFactory.CreateDatabase("BancoQueEstouTrabalhando"); 

    que pega pelo nome da Source ("BancoQueEstouTrabalhando") as configurações do Banco no App.Config (neste caso Oracle).

    está correto esta afirmação, ou muda alguma coisa? como ficaria por exemplo, esta função na camada DAL que chama uma procedure de Pesquisa, para um banco Oracle???

     

     public static List<ConfigDTO> PesquisarConfig(ConfigDTO Filtro)

    {

    Database db = DatabaseFactory.CreateDatabase("Oracle");


                string sqlCommand = "spPesquisarConfig";


                DbCommand cmd = db.GetStoredProcCommand(sqlCommand);


                db.AddInParameter(cmd, "GUID", DbType.String, Functions.HandleValueDB(Filtro.GUID));

                db.AddInParameter(cmd, "CAMPO", DbType.String, Functions.HandleValueDB(Filtro.Campo));

                db.AddInParameter(cmd, "DESCRICAO", DbType.String, Functions.HandleValueDB(Filtro.Descricao));

                db.AddInParameter(cmd, "CHAVE", DbType.String, Functions.HandleValueDB(Filtro.Chave));

                db.AddInParameter(cmd, "VALOR", DbType.String, Functions.HandleValueDB(Filtro.Valor));

                //if (!Filtro.Status.Status.Equals(0))

                    db.AddInParameter(cmd, "STATUS", DbType.Int32, Functions.HandleValueDB(Filtro.Status.Status));


                db.ExecuteNonQuery(cmd);



                List<ConfigDTO> listDTO = new List<ConfigDTO>();

                IDataReader rdr = db.ExecuteReader(cmd);


                while (rdr.Read())

                    listDTO.Add(CarregarObjetoDTO(rdr));


                rdr.Close();

                cmd.Connection.Close();

                cmd.Connection.Dispose();

                cmd.Dispose();


                return listDTO;

     }

    • Movido Gustavo Maia Aguiar segunda-feira, 26 de dezembro de 2011 16:48 (De:SQL Server - Desenvolvimento Geral)
    segunda-feira, 26 de dezembro de 2011 16:37

Respostas

Todas as Respostas

  • Olá Emerson,

    A primeira vista parece que esta certo.

    Vc esta recebendo alguma mensagem de erro?

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    segunda-feira, 26 de dezembro de 2011 17:11
    Moderador
  • Erro>>>>  "ORA-06550: linha 1, coluna 7:\nPLS-00306: número incorreto de tipos de argumentos na chamada para 'SPPESQUISARCONFIG'\nORA-06550: linha 1, coluna 7:\nPL/SQL: Statement ignored\n"

    quarta-feira, 28 de dezembro de 2011 14:01
  • Emerson,

    Parece que sua procedure esta recebendo parâmetros a mais ou a menos do previsto.

    Verifique a estrutura da procedure e veja se esta faltando algum parâmetro ou se esta sobrando algum parâmetro.

    []s!


    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    quarta-feira, 28 de dezembro de 2011 22:07
    Moderador
  • Emerson,

    aparentemente a chamada está correta, porque "chega" no Oracle, o que está errado é a quantidade de parametros que estão sendo enviados para a procedure. Verifique os parametros passados x parametros que a procedure espera.

     

     

    domingo, 8 de janeiro de 2012 16:59
  • Então a quantidade dos tipos de parâmetros esperados na procedure é a mesma da quantidade enviada pela aplicação, os tipos também são os mesmos, a aplicação envia "string" e a procedure espera varchar, e os parametros na proc aceitam null, logo não é necessario passar todos os parâmetros.

    Creio que o erro está na proc, a maneira que executo as instruções armazenadas em uma variavel como string e executada ao final.

    segue um exemplo:

     

    CREATE OR REPLACE PROCEDURE spPesquisarConfig

    (

        GUID                       IN          VARCHAR DEFAULT NULL,  --aqui era uniqueidentifier no SQL

        CAMPO                      IN          VARCHAR DEFAULT NULL,

        DESCRICAO                  IN          VARCHAR DEFAULT NULL,

        CHAVE                      IN          VARCHAR DEFAULT NULL,

        VALOR                      IN          VARCHAR DEFAULT NULL,

        STATUS                     IN          int DEFAULT NULL,

        RCT1                       IN OUT         GLOBALPKG.RCT1           

    )

    AS

        SQL_ADV                                  VARCHAR(2000);

     

        BEGIN

     

        OPEN RCT1 FOR SELECT * FROM TBCONFIG WHERE 1 = 1;

     

     

     

           SQL_ADV  :=  'SELECT * FROM TBCONFIG WHERE 1 = 1 ';

     

            IF( GUID IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND GUID = ''' || GUID || '''';

            NULL;

            END IF;

            IF( CAMPO IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND CAMPO LIKE ''%' || CAMPO || '%''';

            NULL;

            END IF;

            IF( DESCRICAO IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND DESCRICAO LIKE ''%' || DESCRICAO || '%''';

            NULL;

            END IF;

            IF( CHAVE IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND CHAVE = ''' || CHAVE || '''';

            NULL;

            END IF;

            IF( VALOR IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND VALOR LIKE ''%' || VALOR || '%''';

            NULL;

            END IF;

     

            IF( STATUS IS NOT NULL) THEN

            SQL_ADV  :=  SQL_ADV || ' AND STATUS = ' || STATUS || '';

            NULL;

            END IF;

            SQL_ADV  :=  SQL_ADV || ' ORDER BY CAMPO';

     

            EXECUTE IMMEDIATE SQL_ADV;

     

            OPEN RCT1 FOR SQL_ADV;

     

    END;

    segunda-feira, 9 de janeiro de 2012 13:16
  • Emerson,

    Acredito que mesmo os parâmetros sendo DEFAULT NULL na procedure, você precisa passá-los do lado do ADO.NET como DBNull.Value, caso não queira passar nada... Eu faria dois testes:

    1) Tentar passar todos os parâmetros esperados pela procedure... Caso você não queira passar valor nenhum para algum deles, passe DBNull.Value... E, se isso não funcionar, tente:

    2) Comentar todo o código da procedure, deixando somente o recebimento dos parâmetros...


    André Alves de Lima
    Microsoft MVP - Client App Dev
    Visite o meu site: http://www.andrealveslima.com.br
    Me siga no Twitter: @andrealveslima
    segunda-feira, 9 de janeiro de 2012 20:45
    Moderador
  • Alguma evolução Emerson?

    []s!
    Fernando Henrique Inocêncio Borba Ferreira
    while(alive){ this.WriteCode(); }
    Blog: http://ferhenriquef.wordpress.com/
    Twitter: @ferhenrique
    sexta-feira, 13 de janeiro de 2012 11:10
    Moderador