[firebase-br] Firebird ADO.NET Data Provider.
Leonardo Vinicius Freitag
freitagnx em gmail.com
Qua Set 15 14:49:11 -03 2010
Olá pessoal!
Estou com um problema, já pesquisei bastante e não consigo resolver.
Desenvolvi um Web Service para ser consumido por um software que roda em
Pocket PC com Windows Mobile. Esse Web Service utiliza a Firebird
ADO.NETData Provider para acessar um banco de dados de um determinado
sistema que
possuo.
Segue exemplo de um WebMetod:
[WebMethod] // método que retorna dados do produto
public Produtos LerProduto(string produtoCodigo)
{
Produtos meuProduto = new Produtos();
string connectionString;
cnDados stringConexao = new cnDados();
connectionString = stringConexao.GetConexao();
// abertura da conexão e início da transação
FbConnection connection = new FbConnection(connectionString);
connection.Open();
FbTransaction transaction = connection.BeginTransaction();
// exeução do comando no banco de dados
string selectQuery = "SELECT COD_ESTOQUE, NOME, PRECO_VENDA, GRUPO
FROM ESTOQUE WHERE COD_ESTOQUE = @ICOD_ESTOQUE";
FbCommand command = new FbCommand(selectQuery, connection,
transaction);
command.Parameters.Add("@ICOD_ESTOQUE", produtoCodigo);
FbDataReader leitor = command.ExecuteReader();
try
{
if (leitor.Read())
{
meuProduto.ProdCodigo = leitor.GetString(0);
meuProduto.ProdDescricao = leitor.GetString(1);
meuProduto.ProdPreco = leitor.GetFloat(2);
meuProduto.ProdGrupo = leitor.GetString(3);
}
else
{
meuProduto.ProdCodigo = "";
meuProduto.ProdDescricao = "";
meuProduto.ProdPreco = 0;
meuProduto.ProdGrupo = "";
}
return meuProduto;
}
catch (Exception e)
{
throw new Exception();
}
finally
{
transaction.Commit();
leitor.Close();
connection.Close();
}
Segue exemplo de GetConexao();
public string GetConexao()
{
appIp = ConfigurationManager.AppSettings.Get("Key0");
appCaminho = ConfigurationManager.AppSettings.Get("Key1");
appUser = ConfigurationManager.AppSettings.Get("Key2");
appSenha = ConfigurationManager.AppSettings.Get("Key3");
//appDialect = ConfigurationManager.AppSettings.Get("Key4");
FbConnectionStringBuilder cs = new FbConnectionStringBuilder();
cs.DataSource = appIp;
cs.Database = appCaminho;
cs.UserID = appUser;
cs.Password = appSenha;
cs.Dialect = appDialect;
cs.ConnectionLifeTime = 1;
cs.ConnectionTimeout = 15;
cs.MaxPoolSize = 200;
appConexao = cs.ToString();
return appConexao;
}
Tudo funcionava bem, porém deparei-me com uma situação em que acontece um
travamento e me é apresentada uma mensagem no Pocket que finalizava com:
Server was unable to process request.
---> Timeout exceeded.
Tentei utilizar esse mesmo WebMethod para ler produtos no banco de dados
utilizando o Firefox (navegador), e depois de exatos 15 segundos obtive a
seguinte resposta:
System.SystemException: Timeout exceeded.
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckMaxPoolSize()
at FirebirdSql.Data.FirebirdClient.FbConnectionPool.CheckOut()
at FirebirdSql.Data.FirebirdClient.FbConnection.Open()
at Service.LerProduto(String produtoCodigo)
Resolvi então compartilhar meu problema na lista e pedir encarecidamente a
atenção e ajuda dos companheiros.
Leonardo Freitag.
Mais detalhes sobre a lista de discussão lista