1. Operar banco de dados de acesso em Delphi (criar arquivo .mdb, compactar banco de dados)
O código a seguir foi testado em win2k, d6 e mdac2.6.
O programa compilado é executado com sucesso na segunda versão do win98 sem ambiente de acesso.
//antes de usar comobj,activex
//Declara a string de conexão
const
string de conexão = '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:=arquivo;
deletefile(pchar(resultado));
fim;
//============================================== =============================
// procedimento: createaccessfile
// autor: ysai
// data: 27/01/2003
// argumentos: nome do arquivo:string;senha:string=''
// resultado: booleano
//============================================== =============================
function createaccessfile(nome do arquivo:string;senha:string=''):boolean;
//Cria arquivo de acesso, falha se o arquivo existir
var
nome do arquivo temp:string;
vccatalog:olevariante;
começar
nome_do_arquivo_stemp:=getnome_do_caminho_do_arquivo;
tentar
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(format(string de conexão,[stempfilename,senha]));
resultado:=copyfile(pchar(stempfilename),pchar(filename),true);
deletefile(stempfilename);
exceto
resultado:=falso;
fim;
fim;
//============================================== =============================
// procedimento: banco de dados compacto
// autor: ysai
// data: 27/01/2003
// argumentos: afilename,apassword:string
// resultado: booleano
//============================================== =============================
função compactdatabase(nomedoarquivo,senha:string):boolean;
//Comprime e repara o banco de dados, sobrescreve os arquivos de origem
var
nomedoarquivotemp:string;
vje:olevariante;
começar
nome_do_arquivo_stemp:=getnome_do_caminho_do_arquivo;
tentar
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(formato(string de conexão,[nome de arquivo,senha]),
format(sconnectionstring,[stempfilename,apassword]));
resultado:=copyfile(pchar(stempfilename),pchar(afilename),false);
deletefile(stempfilename);
exceto
resultado:=falso;
fim;
fim;
//============================================== =============================
// procedimento: senha do banco de dados alterada
// autor: ysai
// data: 27/01/2003
// argumentos: afilename,aoldpassword,anewpassword:string
// resultado: booleano
//============================================== =============================
função changedatabasepassword(nomedoarquivo,senha antiga,senha nova:string):boolean;
//Modifica a senha do banco de dados de acesso
var
nome do arquivo temp:string;
vje:olevariante;
começar
nome_do_arquivo_stemp:=getnome_do_caminho_do_arquivo;
tentar
vje:=createoleobject('jro.jetengine');
vje.compactdatabase (formato (string de conexão, [nome de arquivo, senha antiga]),
format(sconnectionstring,[stempfilename,umanovasenha]));
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 acesso
A seguinte instrução SQL passou no teste na consulta do Access XP
Criar tabela:
criar tabela tab1 (
contador de identificação,
sequência de nome,
idade inteira,
[data] datahora);
Habilidade:
Os campos de incremento automático são declarados com contador.
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 de data da tab1
crie o índice idate na tab1 ([data]);
Após a conclusão, o atributo índice de data do campo no acesso é exibido como - Sim (há duplicatas).
A instrução a seguir cria um índice não repetível na coluna de nome da tab1
crie um índice exclusivo na tab1 (nome);
Após a conclusão, o atributo de índice do nome do campo no acesso é exibido como - Sim (sem duplicação).
A instrução a seguir exclui os dois índices recém-criados
solte o índice idate na tab1;
solte o nome do índice na tab1;
Comparação de instruções de atualização no access e sqlserver:
Instrução de atualização para atualizar várias tabelas no sqlserver:
atualizar guia1
definir a.nome = b.nome
da tab1 a, tab2 b
onde a.id = b.id;
A instrução sql com a mesma função no acesso deve ser
atualizar tab1 a, tab2 b
definir a.nome = b.nome
onde a.id = b.id;
Ou seja: a instrução update no 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:
atualizar tab1 a,(selecione id,nome da tab2) b
definir a.nome = b.nome
onde a.id = b.id;
Acesse vários bancos de dados de acesso 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 de acesso xp aprovado
Acesse outras fontes de dados odbc no acesso
O exemplo a seguir consulta dados no sqlserver no acesso
selecione * na guia 1 em [odbc]
[odbc;driver=servidor sql;uid=sa;pwd=;servidor=127.0.0.1;banco de dados=demo;]
Os parâmetros completos da propriedade de conexão da fonte de dados externa são:
[odbc;driver=driver;servidor=servidor;banco de dados=banco de dados;uid=usuário;pwd=senha;]
O 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
acesso suporta subconsultas
o acesso suporta junções externas, mas não inclui junções externas completas, se houver suporte
junção à esquerda ou junção à direita
mas não suportado
junção externa completa ou junção completa
Consulta de data no acesso
Nota: O separador de data e hora no acesso é # em vez de aspas
selecione * na guia 1 onde [data]>#2002-1-1#;
No delphi eu uso isso
add(formato(
'selecione * da tab1 onde [data]>#%s#;',
[datatostr(data)]));
As strings de acesso 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.