Arquivos da categoria : DB


Delphi 2010 DBX com SQL Server 2008 3

Há alguns dias eu postei o artigo Configurando DBX para acessar o MS SQL Server 2000 e 2005 no Delphi 2010, hoje o Bob Swart postou em seu blog o artigo Delphi/C++Builder 2010 DBX4 and SQL Native Client sobre o mesmo assunto com um complemento explicando a solução para o erro:

“DBX Error: Driver could not be properly initialized. Client library may be missing, not installed properly, or of the wrong version.”

A solução para este erro é bem clara lendo esta mensagem, se você pretende se conectar ao SQL Server 2008, precisa instalar o cliente para 2008.

No site da Microsoft você encontra o download do cliente nativo para SQL Server 2008:


Visão Geral

O Feature Pack é uma coleção de pacotes de instalação autônoma que agregam valor ao SQL Server 2008. Ele inclui as últimas versões de:

  • Componentes redistribuíveis para SQL Server 2008.
  • Provedores complementares para SQL Server 2008.
  • Componentes de compatibilidade com versões anteriores para SQL Server 2008.


Pré-requisitos

Sistemas Operacionais com Suporte:

  • Windows Server 2003 Service Pack 2;
  • Windows Server 2008;
  • Windows Vista Service Pack 1;
  • Windows XP Service Pack 3;
  • Windows 7 Service Pack 1.


Atenção

Se você usar o SQL Server 2008 no Windows 7, você precisa instalar o Service Pack 1, caso contrário você pode encontrar erros de compatibilidade, como problemas de permissão e não ser possível alterar tabelas existentes.


BDE Install para Windows 64bit 53

Postei no Code Central um instalador para o BDE que funciona para Windows 32bit e Windows 64bit.

O link para download é http://cc.embarcadero.com/item/27573.

O crédito pelo instalador é do Edmar Frazão.

Atenção: O BDE foi descontinuado, então ele não terá atualizações. Por exemplo, nunca terá suporte a Unicode.

Você não deve iniciar o desenvolvimento de novas aplicações com BDE. Considere migrar seus sistemas existentes de BDE para dbExpress.

Atualização 20/abril/2010:

Agradeço a colaboração do Anderson Cabrini e do Cristiander.


Configurando DBX para acessar o MS SQL Server 2000 e 2005 no Delphi 2010 30

No Delphi 2010, por padrão o DBX lista como opção pra acessar o MS SQL Server, um driver chamado MSSQL, que está configurado para acessar o SQL Server 2008, já que o VendorLib está com o valor “sqlncli10.dll”.

Para acessar o SQL Server 2005, tem uma configuração de driver pronta no arquivo dbxdrivers.ini, chamada MSSQL9 já configurado para acessar o SQL Server 2005 com o VendorLib “sqlncli.dll”. Mas este driver dbx não é ativado por padrão, para ativá-lo, você deve adicionar MSSQL9=1 no grupo [Installed Drivers] no início do arquivo dbxdrivers.ini. Após fazer esta alteração, basta reiniciar o Delphi e você vai ver a opção de conexão chamada MSSQL9 no Data Explorer.

O início do meu arquivo dbxdrivers.ini ficou assim:

[Installed Drivers]
DBXTrace=1
DBXPool=1
BlackfishSQL=1
DataSnap=1
ASA=1
ASE=1
DB2=1
Firebird=1
Informix=1
Interbase=1
MSSQL=1
MSSQL9=1
MySQL=1
Oracle=1

 

Para configurar o acesso para o MS SQL Server 2000, você deve usar o Driver MSSQL, e mudar o VendorLib para oledb.dll.

Dica: Se quiser deixar mais claro os nomes dos drivers, você pode mudar o nome dos grupos no dbxdrivers.ini e dos itens no [Installed Drivers], assim:

[Installed Drivers]

MSSQL2008=1
MSSQL2005=1
MSSQL2000=1

[MSSQL2008]

LibraryName=dbxmss.dll
VendorLib=sqlncli10.dll

[MSSQL2005]

LibraryName=dbxmss9.dll
VendorLib=sqlncli.dll

[MSSQL2000]

LibraryName=dbxmss.dll
VendorLib=oledb.dll

 

 

Estas informações estão documentadas no “Release Notes”, que está na pasta de instalação do delphi 2010, a seguir uma tradução do que está escrito, com algumas alterações pra ficar mais claro:

  • O driver MSSQL requer a instalação do Cliente Nativo SQL.
  • Versões suportadas: Microsoft SQL Server 2008, 2005, 2000 (Ent) (Driver dbxMSS.dll, Client oledb.dll) 
MS SQL Server Driver DBX Driver Client
2008 dbxmss.dll sqlncli10.dll
2005 dbxmss9.dll sqlncli.dll
2000 dbxmss.dll oledb.dll

TSQLConnection.Params como ConnectionString 2

Pra quem está acostumado a trabalhar com as tecnologias de banco de dados da Microsoft como ADO, sabe que as configurações de conexão de banco de dados são passadas em uma propriedade chamada ConnectionString, uma linha única contendo todos os parâmetros da conexão separados por ponto e vírgula, diferente da propriedade Params do TSQLConnection, que é uma TStringList.
Ontem eu estava reescrevendo umas classes auxiliares para o TSQLConnection, que agora são especialização de uma classe que salva e carrega as configurações da aplicação em um único arquivo XML, onde cada Objeto é um nó do XML, e cada TSQLConnection tem seu nó XML reservado, mas salvar como TStrings, ficava muito estranho no XML, então fiz umas alterações na minha classe para simular a propriedade ConnectionString.

A primeira alteração foi no método SetSQLConnection, onde eu defino 2 propriedades do Params, “StrictDelimiter = True” e “Delimiter:= ‘;’”.

 
procedure TDBHelper.SetSQLConnection(SQLConnection: TSQLConnection);
begin
  FSQLConnection:= SQLConnection;
  if (FSQLConnection = nil) then
    Exit;
  CloseConnection;
  FSQLConnection.Params.StrictDelimiter:= True;
  FSQLConnection.Params.Delimiter:= ';';
  // <snip>
end;

Em seguida implementei os métodos GetConnectionString e SetConnectionString, interagindo com a propriedade DelimitedText do TStringList.

 
function TDBHelper.GetConnectionString: string;
begin
 Result:= FSQLConnection.Params.DelimitedText;
end;

procedure TDBHelper.SetConnectionString(const Value: string);
begin
  FSQLConnection.Params.DelimitedText:= Value;
end;

A propriedade ConnectionString salva em XML ficou assim:

 
<property name="ConnectionString">
  drivername=FIREBIRD;blobsize=-1;commitretain=False;
  database=D:\DB\HTMCDATA.FDB;localecode=0000;
  Password=masterkey;rolename=RoleName;sqldialect=3;
  isolationlevel=ReadCommitted;user_name=sysdba;waitonlocks=False;
  trim char=True;HostName=localhost;ServerCharSet=WIN1252
</property>

Meu próximo passo neste projeto é adicionar ao sistema, um editor de XML visual que comecei a escrever, ainda não está pronto, mas já me ajuda em algumas tarefas básicas.


XmlViewer


XmlViewer


Firebird DBX Driver 1

Ultimamente somente vejo boas notícias para o Firebird.

  • Ganhou prêmio de projeto no SourceForge
  • Delphi 2010 vai suportar o Firebird
  • Mais um driver DBX gratuíto para Delphi 2007 e 2009 disponível com fontes.

O driver foi escrito pelo programador Chau Chee Yang, há mais ou menos um ano, eu troquei alguns emails com ele, perguntando se ele pretendia disponibilizar os fontes, na mesma época que o Thiago Borges estava lançando as primeiras versões do seu driver, ele me respondeu que ainda não tinha decidido o que fazer, mas agora está disponível e com os fontes.

Links

Os fontes do driver não estão disponíveis, eu mandei uma mensagem na página de suporte perguntando se o autor vai disponibilizar.


Acelerando TClientDataSet com Midas Speed Fix – Unit 12

A partir do post CodeGear, please release the TClientDataSet (midas.dll) code! no Fórum ???delphi.non-technical???, Andreas Hausladen analisou o problema de performance do TClientDataSet, no qual ele comenta no post What a bad ReallocMem can do to Midas, que ele explica que analisando a partir do assembler do MidasLib.dcu, descobriu que a realocação de memória não era feita de forma eficiente, então ele criou a unit Midas Speed Fix, que faz um patch em memória, redirecionando a realocação de memória para os métodos do FastMM.

Para se ter idéia, este é o teste que ele fez e publicou, programa teste em anexo ao QC 7102
[renomeie Vessels200.xml para Vessels.xml nos fonte e coloque um loop "for 1 to 10 do" antes de  lientDataSet1.AppendData"]

Unit MidasLib do Delphi 2009:

1. Chamada: 858ms
2. Chamada: 1966ms
3. Chamada: 3182ms
4. Chamada: 4414ms
5. Chamada: 5678ms

Unit MidasLib do Delphi 2009 mais a unit MidasSpeedFix.pas:
1. Chamada: 406ms
2. Chamada: 265ms
3. Chamada: 374ms
4. Chamada: 312ms
5. Chamada: 281ms

Com estes números, não preciso comentar mais nada, então se você utiliza TClientDataSet, deve baixar esta unit e adicionar aos seus projetos.

MidasSpeedFix.pas, suporta desde o Delphi 6 até o 2009. E no mesmo post que tudo isto começou, Nick Hodges comentou que a correção já foi adicionada aos fontes e que estará na próxima atualização do Delphi 2009.

Referências


PostgreSQL – Lightning Admin por $4.99

A AM Software Design anunciou uma promoção imperdível para quem trabalha com PostgreSQL, até dia 31/dez/2008, o Lightning Admin for PostgreSQL, custa apenas $ 4.99, a partir de 01 de janeiro o preço volta a ser $49.99.

Ainda como parte da promoção, você recebe uma licença do Lightning Admin for MySQL e todas as atualizações inclusive a versão 2.0 quando for lançada.

Lightning Admin é escrito com Delphi 2009 e tem suporte complete a Unicode para dados em PostgreSQL e todos os editores, incluída versão em italiano e arquivo .PO para tradução para outras linguas.


Entendendo NULL 3

Algumas pessoas erroneamente tendem a pensar que NULL é zero ou vazio. Em fato, NULL não é nenhum destes. NULL é literalmente um valor desconhecido ou indeterminado.

O efeito desta natureza indeterminada de um valor NULL é que ele não pode ser usado em cálculos ou em Comparação.

A lista abaixo, contém algumas regras importantes a serem lembradas sobre o comportamento de valores NULL.

  • Um valor NULL não pode ser atribuído a uma coluna definida como NOT NULL
  • Valores NULL não são iguais. ?? um erro freqüente comparar duas colunas que contém NULL e esperar que os valores sejam iguais.
    (Uma coluna NULL pode ser identificada em cláusulas WHERE ou em expressão boleana usando frases como “value IS NULL” e “value IS NOT NULL”.)
  • Uma coluna contendo valor NULL é ignorada em cálculos de valores agregados como AVG, SUM ou MAX.
  • Quando colunas contendo valor NULL em uma condição GROUP BY de uma consulta, o resultado irá conter linhas para estes valores NULL.
  • JOIN entre tabelas, em que uma condição JOIN contém valores e outro contém NULL, são controlados pelas regras de “OUTER JOIN”.

Referências


DBExpress – Campos numéricos com Oracle 7

Acessar campos numéricos do Oracle com o DBExpress pode apresentar problemas de formatação e o erro ???TDBXError with message ‘ORA-01722: número inválido’??? no ApplyUpdates, uma forma de resolver/contornar este problema é definir o parâmetro NLS_NUMERIC_CHARACTERS na conexão do Oracle.

Adicione o código no evento AfterConnect do TSQLConnection:

procedure TMainDM.SQLConnectionAfterConnect(Sender: TObject);
const
  SQL = 'ALTER SESSION SET NLS_NUMERIC_CHARACTERS=''.,''';
begin
  SQLConnection.ExecuteDirect(SQL);
end;

DBX – Executando SQL diretamente na Conexão 8

Na programação com componentes DBExpress, o componente TSQLConnection tem dois métodos muito interessantes:

  • TSQLConnection.Execute – para comandos SQL que incluem parâmetros ou esperam o retorno de cursores.
  • TSQLConnection.ExecuteDirect – para comandos SQL sem parâmetros.

A utilização destes métodos elimina a necessidade de utilizar SQL DataSet para tarefas diretas. Ambos métodos retornam o número de registros afetados pelas instrução SQL, diferente do que está escrito na ajuda do Delphi 2007.

No método ExecuteSQLDirect a seguir, temos algumas técnicas interessantes:

  • Overload do método, podendo utiliza-lo de forma simples e a assinatura completa para a necessidade de tratar todos os parâmetros.
  • Assert, para verificar se os parâmetros passados estão como esperado. Esta é uma técnica importante para identificar erros durante o desenvolvimento e que pode ser eliminado da versão final com uma diretiva de compilação.
  • Controle de Transações com o DBX4, no Delphi 2007 o controle de transações foi reimplementado e os métodos existentes nas versões anteriores marcados como deprecated.
  • Manter códigos ligados a conexão e transação em um único lugar.
function ExecuteSQLDirect(SQLConnection: TSQLConnection;
  const SQL: string; var AffectedRows: Integer): boolean; overload;
var
  Transaction: TDBXTransaction;
begin
  Assert(SQLConnection <> nil, 'SQLConnection can''t be nil');
  Assert(SQL <> EmptyStr, 'SQL can''t be empty');

  Transaction:= SQLConnection.BeginTransaction;
  try
    try
      AffectedRows:= SQLConnection.ExecuteDirect(SQL);
    except
      AffectedRows:= 0;
    end;
  finally
    Result:= AffectedRows > 0;
    if Result then
      SQLConnection.CommitFreeAndNil(Transaction)
    else
      SQLConnection.RollbackFreeAndNil(Transaction);
  end;
end;

function ExecuteSQLDirect(const SQL: string): boolean; overload;
var
  Rows: Integer;
begin
  Result:= ExecuteSQLDirect(MainDataModule.SQLConnection,
    SQL, Rows);
end;

Implementei este código no mesmo Data Module onde mantenho o componente de conexão TSQLConnection, permitindo que eu tenha uma versão mais simples de ExecuteSQLDirect, passando o TSQLConnection.

O código a seguir foi implementado em outro Data Module, note o método DeleteAllColumns, este é o método que será chamado a partir das ações dos formulários, separando o código de tratamento dos dados. E se algum erro acontecer durante a exclusão dos registros, uma exceção de tipo específico a este domínio será levantada, ajudando na identificação dos possível erros em tempo de execução.

procedure TDataModuleImport.DeleteAllColumns;
const
  SQL = 'DELETE FROM FPL_IMP_COLUMN WHERE FILE_ID = %d';
  EMsg = 'Não foi possível excluir todas as colunas.';
begin
  if CDSImpFileID.IsNull then
    Exit;

  if not ExecuteSQLDirect(Format(SQL, [CDSImpFileID.Value])) then
    raise EColumnError.Create(EMsg);
end;

Note que a mensagem de erro neste método está em português e no outro método, quando utilizei o Assert, as mensagens estão em inglês. Isto é, por que as mensagens de Assert são para o programador e não para o usuário final.