Usuário com melhor resposta
Lentidão na conexão SQL 2005 através de aplicativo COM+

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
Respostas
-
Ok, Amigo, Acabei fazendo a dll com base na sua, onde somente abro a conexão. Até que ficou boa!!!
Obrigado!- Marcado como Resposta Harley AraujoModerator terça-feira, 26 de outubro de 2010 13:23
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. -
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- Editado David Takazaki segunda-feira, 25 de maio de 2009 20:01
-
Ok, Amigo, Acabei fazendo a dll com base na sua, onde somente abro a conexão. Até que ficou boa!!!
Obrigado!- Marcado como Resposta Harley AraujoModerator terça-feira, 26 de outubro de 2010 13:23