Novidades em Banco de Dados no Delphi 2007 for Win32
A CodeGear anunciou o Delphi 2007 for Win32 para ser lançado em março, também conhecido como Spacely. Uma das novidades interessantes é a atualização do DbExpress, chamado de DBX4. O Steve Shaughnessy, líder da equipe de desenvolvimento de banco de dados para o Delphi, escreveu um post sobre essas novidades. Como também participei do desenvolvimento de alguns desses novos recursos, também quero falar um pouco sobre essas mudanças.
Componentes vs API
Ao pensarmos em DbExpress, pensamos primeiramente nos componentes de acesso à banco de dados. O TSqlConnection, TSqlQuery, e afins. É fácil de entender isso, pois até agora não existia uma API definida para utilizar facilmente o DBX sem ser através esses componentes. O que existia era uma interface COM exposta por drivers em DLLs, escritos em C++, que não era nem um pouco fácil de ser usada diretamente, e nem de escrever novos drivers. Isso afetava também o deployment de aplicações DbExpress, que precisavam levar junto as DLLs de cada driver que fosse eventualmente ser utilizado.
No DBX4 foi criada uma API definida, escrita em Delphi, com o mesmo código fonte para código nativo ou gerenciado, que pode ser utilizada diretamente na sua aplicação, ou indiretamente através dos componentes como antigamente, sem alteração alguma. Pra quem for recompilar sua aplicação em no Delphi 2007 for Win32, não vai ver nenhuma alteração na superfície. Quem for escrever uma aplicação nova, também não vai ver diferenças de imediato. Por baixo dos componentes, porém, começam as vantagens.
Drivers escritos em Delphi
Drivers podem agora ser escritos em Delphi, extendendo algumas classes diretamente. Não é mais necessário ter drivers em DLLs externas e ter que enviá-los com a sua aplicação. Drivers que forem escritos em Delphi podem simplesmente ser adicionados no uses da sua aplicação e compilados automaticamente. Se preferir carregar os drivers dinamicamente, você pode usar runtime packages e usar um LoadPackage() para carregar a BPL com o driver que quiser.
E os drivers para DBX3 que já tenho em DLLs? Eles continuam funcionando, através de um driver chamado Dynalink que carrega as DLLs e serve de ponte entre elas e a nova API, de forma transparente. Nessa primeira versão ainda estaremos distribuindo os oito drivers em DLLs, como na versão anterior, mas com melhorias e correções de problemas neles.
Delegate Drivers
O DBX também suporta o que são chamados de Delegate Drivers. Esses drivers podem ser usados no pré e pós processamento de qualquer método ou propriedade de um driver, e podem ser encadeados um após o outro. Delegate Drivers fazem alguma ação e delegam o comando para o driver real.
Dois Delegate Drivers que foram criados, que serão incluidos com todo o código fonte escrito em Delphi, são o TDBXTrace e TDBXPool. O TDbxPool dá a capacidade de pooling de conexões para o DBX, evitando a espera de criação e abertura de cada conexão, particularmente útil pra quem faz diversas conexões com o banco de dados, como em aplicações web.
Já o TDbxTrace permite monitorar todos os comandos que estão sendo passados para o driver (como o Sql Monitor), e, o mais interessante, gera código Delphi descrevendo todas as ações executadas (sendo possível compilar o código gerado e rodá-lo para repetir todas essas ações!). Um exemplo de saída desse driver dado pelo Steve:
{CONNECT } Connection2.Open;
{COMMAND } Command2_1 := Connection2.CreateCommand;
{COMMAND } Command2_1.CommandType := Dbx.SQL;
{COMMAND } Command2_1.Text := 'SELECT * FROM BASICDML order by F_VARCHAR';
{PREPARE } Command2_1.Prepare;
{COMMAND } Reader2_1_1 := Command2_1.ExecuteQuery;
{COMMAND } Command2_2 := Connection2.CreateCommand;
{COMMAND } Command2_2.CommandType := Dbx.MetaData;
{COMMAND } Command2_2.Text := 'GetIndexes "workerbee:c:\database\employee.gdb"."sysdba"."BASICDML" ';
{COMMAND } Reader2_2_1 := Command2_2.ExecuteQuery;
{COMMAND } FreeAndNil(Command2_2);
Um código assim é bem mais fácil de acompanhar do que um log de baixo nível dado por um SQL Monitor. Outro ponto interessante é o fato desse monitoramento não estar fixo no framework – a flexibilidade: se o formato não for adequado para você, basta escrever um novo Delegate Driver, possivelmente partindo do código fonte deste já existente.
Delegate Drivers abrem possibilidades de diversos usos, como replicação, por exemplo. Quero ver o que a comunidade vai criar em cima disso.
Extended Commands
A saída do TDbxTrace dada como exemplo acima acaba apontando mais um novo recurso – os Comandos Extendidos. Anteriormente os CommandTypes aceitos por um driver eram restritos à uma query, stored procedure, ou uma table. Vários dados podem ser requisitados passando algumas parâmetros e representados em um resultset. Agora os drivers pode definir novos tipos de comandos extendidos que funcionam como queries, mas retornam esses dados. Veja que o log acima aponta o CommandType como sendo Dbx.MetaData, e usa uma “query” GetIndexes para retornar os indices de uma tabela.
DBX4
Esses são algumas das novidades da área de banco de dados com o DBX4 no Delphi 2007 for Win32, que acredito que vão cada vez mais permitir que novas e melhores coisas sejam feitas no futuro. Além disso estamos corrigindo bugs, melhorando o produto e trabalhando em coisas que ainda não estão prontas para serem divulgadas. Fique ligado para mais novidades.
Em 21 de fevereiro de 2007 às 17:33
Excelente artigo!
O TDbxTrace foi uma idéia muito boa mesmo!
Falowzzzzzzzzzzzzzzzzz
Em 21 de fevereiro de 2007 às 20:46
Veremos com os testes na prática, qdo saiu dbExpress, lembro-me que sofri com as queries unidirecionais, com formatos BCD’s em alguns banco de dados etc…
Vamos ver as reais vantagens na prática.
Wilson
Em 09 de março de 2007 às 21:26
Concordo com o Wilson, pois tive os mesmos problemas e hoje utilizando a versao do delphi 7 com dbexpress tenho que adicionar varios codigos a mais para contornar uma serie de bugs que foi deixado para traz
Cleiton Sousa
Em 10 de março de 2007 às 00:26
O que eu posso recomendar pra você é: garanta que esses bugs estão no quality central. Se estiverem lá, existem uma boa chance de já terem sidos corrigidos para essa nova versão. Se não tiverem, é bem mais difícil corrigirmos bugs que não conhecemos.
Mesmo assim, planejamos lançar atualizações e correções de uma forma mais frequente do antes.
Mas, é claro, vocês tem razão: esperem a nova versão e vejam por si mesmo.
Em 22 de fevereiro de 2007 às 10:18
Ótima noticia Leonel
Abração,
Diego M. Garcia
Em 23 de fevereiro de 2007 às 23:08
[...] Falando sobre as novidades do Delphi 2007 for Win32, especificamente sobre o DBExpress 4, vocês não podem deixar de visitar o artigo do Leonel Togniolli neste artigo sobre Novidades em Banco de Dados no Delphi 2007 for Win32. [...]
Em 24 de fevereiro de 2007 às 17:12
Excelente novidade! Os drivers em Delphi virão com fontes? Já existe algum específico para Firebird?
Grande abraço,
ric@rdo
Em 26 de fevereiro de 2007 às 13:27
Sim, a intenção é incluir o fonte de todos os drivers em Delphi.
Em 25 de fevereiro de 2007 às 19:31
Bem e quanto ao driver para Firebird que estava sendo votado… nõa se sabe nada se vai sair algo no novo DBX?
Em 26 de fevereiro de 2007 às 13:00
Não posso prometer nada ainda de novos recursos ou drivers. Fique ligado.
Em 26 de fevereiro de 2007 às 10:31
Eu gostaria de sabe se nessas modificação, fizeram alguma melhoria qto a utilização do
SQLCommandText, pois atualmente a utilização desse comando, substitui o SQLOriginal
do DataSet associado, eu acho que o SQLCommandText deveira funcionar como sendo
temporário sem alfetar o SQLOriginal, assim qdo ativamos novamente o CDS sem passar
nada no SQLCommandText, o SQLOriginal fosse executado novamente.
Em 26 de fevereiro de 2007 às 13:34
Dirceu,
Existe algum caso sobre isso logado no Quality Central? Ele é a melhor forma de conseguir alguma melhoria ou alteração no produto.
Em 27 de fevereiro de 2007 às 15:55
Legal, vamos esperar para ver ….
Espero que tenham melhorado o driver p/ MS SQL, pois, o driver “padrão”
apresenta alguns problemas (em algumas situações extremas) até na versão que acompanha o delphi 2006 (problemas estes que não ocorrem com outros drivers pagos).
O fato de vir com os códigos fontes será muito bem vindo !
Em 27 de fevereiro de 2007 às 16:32
Se esses bugs estão no quality central, existe uma boa chance de terem sido corrigidos.
Em 12 de maio de 2007 às 18:42
Delphi 2007 for Win32 simplesmente RULEZ!!!! Rápido, leve, no “sucks”…
ótimo trabalho da codegear!!!!
Em 12 de junho de 2007 às 21:21
Leonel o que devo distribuir junto com minha aplicação para o DBX4 funcionar?
Em 12 de junho de 2007 às 21:46
Se você está usando um driver Dynalink, precisa da DLL do driver (dbxint30.dll para o IB, por exemplo), e do cliente do banco de dados (gds32.dll, nesse caso).
É bem provável que você esteja usando ClientDataSets, então deve distribuir a midas.dll (e registrar com regsvr32 na instalação), ou adicionar midaslib no uses da sua aplicação.
Em 28 de julho de 2007 às 23:29
Gostaria de obter uma ajuda em como resolver o problema do uso do Paradox com Vista. Quais as modificações necessárias para o usuário não receber a notícia: Network initialization failed. Permisson denied…
Obrigado
Einar Arthur Berger
Em 29 de julho de 2007 às 19:07
Einar,
Creio que esse problema possa ser resolvido alterando no BDE o parâmetro “Configuration\Drivers\Native\Paradox\NET DIR”, para um diretório diferente de C:\ no qual o usuário corrente tenha permissão de escrita. Fiz um teste aqui agora, no Vista Business, alterando-o para C:\Temp\ e atribuindo todas as permissões ao usuário para esse diretório e funcionou sem problemas.
sugiro que, caso ainda tenha alguma dúvida, poste-a no news de Delphi da trollnet: news://trollnet.no-ip.org/vtnc.Linguagens.Delphi
Como o TechTips não é um site de suporte técnico
Espero ter ajudado!
Em 20 de dezembro de 2007 às 23:23
Leonel,
Como faço para delegar um driver com SQLServer? Estou tentando fazer com e sem, porém, não estou conseguindo por ele não ter o caminho “DelegateConnection=DBXTraceConnection”
Poderia me explicar?