1. Operar banco de dados de acesso em DELPHI (criar arquivo .mdb, compactar banco de dados)
O código a seguir passou no teste em WIN2K, D6, MDAC2.6,
O programa compilado é executado com sucesso na segunda versão do WIN98 sem ambiente ACCESS.
//Antes de usar ComObj,ActiveX
//Declara a string de conexão
Const.
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;Fonte de dados=%s;'
+'Jet OLEDB:Senha do banco de dados=%s;';
//============================================== =============================
// Procedimento: GetTempPathFileName
// Autor: ysai
// Data: 27/01/2003
// Argumentos: (Nenhum)
// Resultado: string
//============================================== =============================
função GetTempPathFileName():string;
//Obtém o nome do arquivo temporário
var
SPath,SFile: array [0..254] de char;
começar
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
resultado:=SFarquivo;
DeleteFile(PChar(resultado));
fim;
//============================================== =============================
//Procedimento: CreateAccessFile
// Autor: ysai
// Data: 27/01/2003
// Argumentos: NomeArquivo:String;Senha:string=''
// Resultado: booleano
//============================================== =============================
function CreateAccessFile(NomeArquivo:String;Senha:string=''):boolean;
//Criar arquivo Access, falhará se o arquivo existir
var
STempFileName: string;
vCatalog:OleVariant;
começar
STempFileName:=GetTempPathFileName;
tentar
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(format(SConnectionString,[STempFileName,PassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(FileName),True);
DeleteFile(STempFileName);
exceto
resultado:=falso;
fim;
fim;
//============================================== =============================
// Procedimento: CompactDatabase
// Autor: ysai
// Data: 27/01/2003
// Argumentos: AFileName,APassWord:string
// Resultado: booleano
//============================================== =============================
function CompactDatabase(AFileName,APassWord:string):boolean;
//Comprime e repara o banco de dados, sobrescreve os arquivos de origem
var
STempFileName: string;
vJE:OleVariant;
começar
STempFileName:=GetTempPathFileName;
tentar
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(formato(SConnectionString,[AFileName,APassWord]),
format(SConnectionString,[STempFileName,APassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
exceto
resultado:=falso;
fim;
fim;
//============================================== =============================
//Procedimento: ChangeDatabasePassword
// Autor: ysai
// Data: 27/01/2003
// Argumentos: AFileName,AOldPassWord,ANewPassWord:string
// Resultado: booleano
//============================================== =============================
função ChangeDatabasePassword(AFileName,AOldPassWord,ANewPassWord:string):boolean;
//Modifica a senha do banco de dados ACCESS
var
STempFileName: string;
vJE:OleVariant;
começar
STempFileName:=GetTempPathFileName;
tentar
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(formato(SConnectionString,[AFileName,AOldPassWord]),
format(SConnectionString,[STempFileName,ANewPassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
DeleteFile(STempFileName);
exceto
resultado:=falso;
fim;
fim;
2. Coisas que você deve prestar atenção e algumas dicas ao usar instruções SQL no ACCESS
A seguinte instrução SQL passou na consulta no ACCESS XP
Criar tabela:
Criar Tabela Tab1 (
Contador de identificação,
Cadeia de caracteres de nome,
Número inteiro de idade,
[Data] DataHora);
Habilidade:
Os campos de incremento automático são declarados com Counter.
Os campos cujos nomes de campo são palavras-chave são colocados entre colchetes [] e os números também são aceitáveis como nomes de campo.
Criar índice:
A instrução a seguir cria um índice repetível na coluna Data da Tab1
Criar Índice iDate ON Tab1 ([Data]);
Após a conclusão, o atributo índice de data do campo no ACCESS é exibido como - Sim (há duplicatas).
A instrução a seguir cria um índice não repetível na coluna Nome da Tab1
Criar índice exclusivo iName ON Tab1 (Nome);
Após a conclusão, o atributo de índice do campo Nome no ACCESS é exibido como - Sim (sem duplicação).
A instrução a seguir exclui os dois índices recém-criados
Solte o índice iDate na guia 1;
Soltar índice iName ON Tab1;
Comparação das instruções ACCESS e UPDATE no SQLSERVER:
Instrução UPDATE para atualizar várias tabelas no SQLSERVER:
ATUALIZAR Guia 1
DEFINIR a.Nome = b.Nome
DA Guia1 a, Guia2 b
ONDE a.ID = b.ID;
A instrução SQL com a mesma função em ACCESS deve ser
ATUALIZAR Guia1 a, Guia2 b
DEFINIR a.Nome = b.Nome
ONDE a.ID = b.ID;
Ou seja: a instrução UPDATE em ACCESS não possui uma cláusula FROM e todas as tabelas referenciadas são listadas após a palavra-chave UPDATE.
No exemplo acima, se Tab2 não for uma tabela, mas sim uma consulta, por exemplo:
UPDATE Tab1 a,(Selecione ID,Nome da Tab2) b
DEFINIR a.Nome = b.Nome
ONDE a.ID = b.ID;
Acesse vários bancos de dados ACCESS diferentes - use a cláusula In no SQL:
Selecione a.*,b.* Da Tab1 a,Tab2 b Em 'db2.mdb' Onde a.ID=b.ID;
A instrução SQL acima consulta todos os registros associados a Tab2 em Tab1 e db2.mdb (na pasta atual) no banco de dados atual.
Desvantagens - Bancos de dados externos não podem ter senhas.
Suplemento: vi a resposta do ugvanxk em uma postagem e posso usá-la
Selecione * em [c:/aa/a.mdb;pwd=1111].table1;
Teste ACCESS XP aprovado
Acesse outras fontes de dados ODBC no ACCESS
O exemplo a seguir consulta os dados no SQLSERVER no ACCESS
SELECIONE * DA Guia 1 EM [ODBC]
[ODBC;Driver=SQL Server;UID=sa;PWD=;Servidor=127.0.0.1;DataBase=Demo;]
Os parâmetros completos da propriedade de conexão da fonte de dados externa são:
[ODBC;DRIVER=driver;SERVER=servidor;DATABASE=banco de dados;UID=usuário;PWD=senha;]
DRIVER=driver pode ser encontrado no registro
HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI/
encontrado em
Para importação de dados entre bancos de dados heterogêneos, consulte Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS suporta subconsultas
ACCESS oferece suporte a junções externas, mas não inclui junções externas completas. Se houver suporte,
LEFT JOIN ou DIREITA JOIN
mas não suportado
FULL OUTER JOIN ou FULL JOIN
Consulta de data no ACCESS
Nota: O separador de data e hora no ACCESS é # em vez de aspas
Selecione * Da Guia 1 Onde [Data]>#2002-1-1#;
No DELPHI eu uso isso
SQL.Add(Format(
'Selecione * Da Tab1 Onde [Data]>#%s#;',
[DateToStr(Data)]));
As strings no ACCESS podem ser separadas por aspas duplas, mas o SQLSERVER não as reconhece, portanto, para conveniência de migração e compatibilidade,
Recomenda-se usar aspas simples como delimitadores de string.