none
Lentidão na conexão SQL 2005 através de aplicativo COM+ RRS feed

  • Pergunta

  • E aí pessoal,

    Eu tenho uma DLL feita em C# para conectar com um banco de dados SQL 2005, que está registrada como um aplicativo COM+ e consumo ela no asp clássico. O intuito dessa DLL é somente ocultar a string de conexão com a senha, usuario, etc.

    Nessa DLL utilizo ADODB.Connection e ADODB.RecordSet e retorno para o ASP clássico os objetos para poder trabalha-los de lá.

    Essa DLL está funcionando corretamente, com ela eu consigo abrir um recordSet, conectar com o banco, rodar query, etc.

    O problema é o seguinte, há um pouco de lentidão quando conecto por ela, há relatorios maiores que funcionavam normalmente antes de usar essa DLL, mas com ela fica tão lento que esses relatorios maiores acabam excedendo o limite de tempo de execução de script do ASP.

    Alguém tem alguma idéia do que fazer para melhorar o desempenho de um aplicativo COM+ de conexão com banco de dados?



    segue o codigo fonte da dll, tipo eu uso o ADODB ao inves ADO.net por causa que eu retorno para o asp classico


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;
    using System.Data.SqlClient;
    using ADODB;
    using System.Threading;

    [assembly: ApplicationName("Wx7Conexao")]
    [assembly: Description("Conexao com dados para banco da Forma Turismo com COM+")]
    [assembly: ApplicationActivation(ActivationOption.Server)]
    [assembly: ApplicationAccessControl(false, AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]

    namespace
    Wx7
    {
        public class Conexao :
    ServicedComponent
        {
            //Declaracao dos objetos, variaveis
            private ADODB.Command CMD = new ADODB.Command();
            private ADODB.Connection DB = new ADODB.Connection();
            private ADODB.Recordset RS = new ADODB.Recordset();
            private String connectionString = "";
            private String dataSourceVC = "";
            private String initialCatalogVC = "";
            private String passwordVC = "";
            private String userIdVC = "";

            //seleciona os dados do ambiente dependendo do ambiente solicitado (eu apaguei o case que define as variaveis no codigo aqui) **************** ****************** ******* ******** *****
            public String selecionaDadosSQL(String ambienteVC)
            {

                    initialCatalogVC = "banco";
                    userIdVC = "usuario";
                    passwordVC = "senha";
                    dataSourceVC = "banco";
                

                return "Initial Catalog=" + initialCatalogVC + "; Data Source=" + dataSourceVC + "; Provider=SQLOLEDB.1; Persist Security Info=True; User ID=" + userIdVC + "; Password=" + passwordVC + ";";

            }

            //abre a conexao com o banco de dados ******** ********* ********** ******** ******* *******

            public ADODB.Connection openConnection(String ambienteVC)
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.DB.Open(connectionString, this.userIdVC, this.passwordVC, 0);
                return this.DB;
            }

            //cria o record set com o activeConnecion definido ****** ******** ******** ******* *******
            public ADODB.Recordset createRecordSet(String ambienteVC) 
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.RS.let_ActiveConnection(connectionString);
                return this.RS;
            }

            //cria o command do ADODB com o active connection definido ******* ******** ******* ******

            public ADODB.Command createCommand(String ambienteVC)
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.CMD.let_ActiveConnection(connectionString);
                clearParameters(CMD);
                return this.CMD;
            }

            //fecha a conexao com o banco de dados ********* ********** ********** ********* ****** ****

            public void closeConnection()
            {
                this.DB.Close();
            }

            //limpa possiveis parametros **** ******** ************ *********** ******** ******* ********
            public void clearParameters(ADODB.Command CMD) 
            {
                while (CMD.Parameters.Count > 0)
                {
                    CMD.Parameters.Delete(0);
                }
            }

            
    //destrutor **** ******** ************ *********** ******** ******* ********
            ~Conexao ()
            {
                this.Dispose();
            }

            public
    void Dispose()
            {
                GC.SuppressFinalize(this);
            }

        }

    }

    espero retorno

    valeu!


    David
    quinta-feira, 12 de março de 2009 21:11

Respostas

Todas as Respostas

  • E aí pessoal,

    Eu tenho uma DLL feita em C# para conectar com um banco de dados SQL 2005, que está registrada como um aplicativo COM+ e consumo ela no asp clássico. O intuito dessa DLL é somente ocultar a string de conexão com a senha, usuario, etc.

    Nessa DLL utilizo ADODB.Connection e ADODB.RecordSet e retorno para o ASP clássico os objetos para poder trabalha-los de lá.

    Essa DLL está funcionando corretamente, com ela eu consigo abrir um recordSet, conectar com o banco, rodar query, etc.

    O problema é o seguinte, há um pouco de lentidão quando conecto por ela, há relatorios maiores que funcionavam normalmente antes de usar essa DLL, mas com ela fica tão lento que esses relatorios maiores acabam excedendo o limite de tempo de execução de script do ASP.

    Alguém tem alguma idéia do que fazer para melhorar o desempenho de um aplicativo COM+ de conexão com banco de dados?



    segue o codigo fonte da dll, tipo eu uso o ADODB ao inves ADO.net por causa que eu retorno para o asp classico


    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Runtime.InteropServices;
    using System.EnterpriseServices;
    using System.Data.SqlClient;
    using ADODB;
    using System.Threading;

    [assembly: ApplicationName("Wx7Conexao")]
    [assembly: Description("Conexao com dados para banco da Forma Turismo com COM+")]
    [assembly: ApplicationActivation(ActivationOption.Server)]
    [assembly: ApplicationAccessControl(false, AccessChecksLevel = AccessChecksLevelOption.ApplicationComponent)]

    namespace
    Wx7
    {
        public class Conexao :
    ServicedComponent
        {
            //Declaracao dos objetos, variaveis
            private ADODB.Command CMD = new ADODB.Command();
            private ADODB.Connection DB = new ADODB.Connection();
            private ADODB.Recordset RS = new ADODB.Recordset();
            private String connectionString = "";
            private String dataSourceVC = "";
            private String initialCatalogVC = "";
            private String passwordVC = "";
            private String userIdVC = "";

     

            //seleciona os dados do ambiente dependendo do ambiente solicitado (eu apaguei o case que define as variaveis no codigo aqui) **************** ****************** ******* ******** *****
            public String selecionaDadosSQL(String ambienteVC)
            {

                    initialCatalogVC = "banco";
                    userIdVC = "usuario";
                    passwordVC = "senha";
                    dataSourceVC = "banco";
                

     

                return "Initial Catalog=" + initialCatalogVC + "; Data Source=" + dataSourceVC + "; Provider=SQLOLEDB.1; Persist Security Info=True; User ID=" + userIdVC + "; Password=" + passwordVC + ";";

            }

            //abre a conexao com o banco de dados ******** ********* ********** ******** ******* *******

            public ADODB.Connection openConnection(String ambienteVC)
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.DB.Open(connectionString, this.userIdVC, this.passwordVC, 0);
                return this.DB;
            }

            //cria o record set com o activeConnecion definido ****** ******** ******** ******* *******
            public ADODB.Recordset createRecordSet(String ambienteVC) 
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.RS.let_ActiveConnection(connectionString);
                return this.RS;
            }

            //cria o command do ADODB com o active connection definido ******* ******** ******* ******

            public ADODB.Command createCommand(String ambienteVC)
            {
                connectionString = selecionaDadosSQL(ambienteVC);
                this.CMD.let_ActiveConnection(connectionString);
                clearParameters(CMD);
                return this.CMD;
            }

            //fecha a conexao com o banco de dados ********* ********** ********** ********* ****** ****

            public void closeConnection()
            {
                this.DB.Close();
            }

            //limpa possiveis parametros **** ******** ************ *********** ******** ******* ********
            public void clearParameters(ADODB.Command CMD) 
            {
                while (CMD.Parameters.Count > 0)
                {
                    CMD.Parameters.Delete(0);
                }
            }

            
    //destrutor **** ******** ************ *********** ******** ******* ********
            ~Conexao ()
            {
                this.Dispose();
            }

            public
    void Dispose()
            {
                GC.SuppressFinalize(this);
            }

        }

    }

    espero retorno

    valeu!


    David

    Amigo,

    Poderia me mandar o exemplo de retorno de um recordset no asp? Estou fazendo algo parecido com o seu só que na hora de executar o comando da erro.
    segunda-feira, 18 de maio de 2009 14:48
  • No asp clássico tem que criar o objeto:

    set conexao = server.createObject("namespace.Class")

    tipo se vc olhar no codigo vai ver que eu tenho um metodo para o recordSet que se chama "createRecordSet", ele só define a conexão ativa, aí é só instanciar o método no asp clássico:

    set RS = conexao.createRecordSet()

    depois é só trabalhar no asp normal

    RS.Open "select...", , , 1

    se vc puder posta o erro aí pra eu poder dar uma força!!

    Mas assim, eu tenho ainda um problema com essa DLL por ser C# e tentar conversar com o ASP clássico, eu recomendo que vc faça a DLL em VB

    flw
    David
    segunda-feira, 25 de maio de 2009 16:04
  • Ok, Amigo, Acabei fazendo a dll com base na sua, onde somente abro a conexão. Até que ficou boa!!!

    Obrigado!

    terça-feira, 16 de junho de 2009 20:23