1. Operar el acceso a la base de datos en DELPHI (crear un archivo .mdb, comprimir la base de datos)
El siguiente código pasó la prueba en WIN2K, D6, MDAC2.6,
El programa compilado se ejecuta correctamente en la segunda versión de WIN98 sin entorno ACCESS.
//Antes de usar ComObj,ActiveX
//Declarar la cadena de conexión
constante
SConnectionString = 'PRovider=Microsoft.Jet.OLEDB.4.0;Fuente de datos=%s;'
+'Jet OLEDB:Contraseña de la base de datos=%s;';
//================================================== ==============================
// Procedimiento: GetTempPathFileName
// Autor: ysai
// Fecha: 2003-01-27
// Argumentos: (Ninguno)
// Resultado: cadena
//================================================== ==============================
función GetTempPathFileName():cadena;
//Obtener el nombre del archivo temporal
var
SPath,SFile: matriz [0..254] de carácter;
comenzar
GetTempPath(254,SPath);
GetTempFileName(SPath,'~SM',0,SFile);
resultado:=SArchivo;
EliminarArchivo(PChar(resultado));
fin;
//================================================== ==============================
// Procedimiento: Crear archivo de acceso
// Autor: ysai
// Fecha: 2003-01-27
// Argumentos: Nombre de archivo:Cadena;Contraseña:cadena=''
// Resultado: booleano
//================================================== ==============================
función CreateAccessFile(Nombre de archivo:Cadena;Contraseña:cadena=''):booleano;
//Crear archivo de Access, falla si el archivo existe
var
STempFileName: cadena;
vCatalog:OleVariant;
comenzar
STempFileName:=GetTempPathFileName;
intentar
vCatalog:=CreateOleObject('ADOX.Catalog');
vCatalog.Create(formato(SConnectionString,[STempFileName,PassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(FileName),True);
EliminarArchivo(STempFileName);
excepto
resultado:=falso;
fin;
fin;
//================================================== ==============================
// Procedimiento: Base de datos compacta
// Autor: ysai
// Fecha: 2003-01-27
// Argumentos: NombreDeArchivo,PalabraPassA:cadena
// Resultado: booleano
//================================================== ==============================
función CompactDatabase(AFileName,APpassWord:string):boolean;
//Comprimir y reparar la base de datos, sobrescribir los archivos fuente
var
STempFileName: cadena;
vJE:OleVariant;
comenzar
STempFileName:=GetTempPathFileName;
intentar
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(formato(SConnectionString,[AFileName,APpassWord]),
formato(SConnectionString,[STempFileName,APPassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
EliminarArchivo(STempFileName);
excepto
resultado:=falso;
fin;
fin;
//================================================== ==============================
// Procedimiento: Cambiar contraseña de la base de datos
// Autor: ysai
// Fecha: 2003-01-27
// Argumentos: AFileName,AOldPassWord,ANewPassWord:cadena
// Resultado: booleano
//================================================== ==============================
función CambiarContraseñadebasededatos(AFfileName,AoldPassWord,ANewPassWord:string):boolean;
//Modificar contraseña de la base de datos ACCESS
var
STempFileName: cadena;
vJE:OleVariant;
comenzar
STempFileName:=GetTempPathFileName;
intentar
vJE:=CreateOleObject('JRO.JetEngine');
vJE.CompactDatabase(formato(SConnectionString,[AFileName,AOldPassWord]),
formato(SConnectionString,[STempFileName,ANewPassWord]));
resultado:=CopyFile(PChar(STempFileName),PChar(AFileName),false);
EliminarArchivo(STempFileName);
excepto
resultado:=falso;
fin;
fin;
2. Cosas a las que debes prestar atención y algunos consejos al utilizar sentencias SQL en ACCESS
La siguiente declaración SQL pasó la consulta en ACCESS XP
Crear tabla:
Crear tabla Tab1 (
contador de identificación,
cadena de nombre,
Entero de edad,
[Fecha] FechaHora);
Habilidad:
Los campos de incremento automático se declaran con Counter.
Los campos cuyos nombres de campo son palabras clave están entre corchetes [] y los números también son aceptables como nombres de campo.
Crear índice:
La siguiente declaración crea un índice repetible en la columna Fecha de Tab1
Crear índice iDate EN Tab1 ([Fecha]);
Una vez completado, el atributo de índice de fecha del campo en ACCESS se muestra como Sí (hay duplicados).
La siguiente declaración crea un índice no repetible en la columna Nombre de Tab1
Crear índice único iName EN Tab1 (Nombre);
Una vez completado, el atributo de índice del campo Nombre en ACCESS se muestra como Sí (sin duplicación).
La siguiente declaración elimina los dos índices recién creados.
Colocar índice iDate en Tab1;
Colocar índice iName en Tab1;
Comparación de declaraciones ACCESS y UPDATE en SQLSERVER:
Declaración ACTUALIZAR para actualizar varias tablas en SQLSERVER:
ACTUALIZAR pestaña 1
SET a.Nombre = b.Nombre
DESDE Tab1 a, Tab2 b
DONDE a.ID = b.ID;
La sentencia SQL con la misma función en ACCESS debe ser
ACTUALIZAR Tab1 a, Tab2 b
SET a.Nombre = b.Nombre
DONDE a.ID = b.ID;
Es decir: la declaración UPDATE en ACCESS no tiene una cláusula FROM y todas las tablas a las que se hace referencia se enumeran después de la palabra clave UPDATE.
En el ejemplo anterior, si Tab2 no es una tabla, sino una consulta, por ejemplo:
ACTUALIZAR Tab1 a, (Seleccione ID, Nombre de Tab2) b
SET a.Nombre = b.Nombre
DONDE a.ID = b.ID;
Acceda a varias bases de datos de ACCESS diferentes: utilice la cláusula In en SQL:
Seleccione a.*,b.* De Tab1 a,Tab2 b En 'db2.mdb' Donde a.ID=b.ID;
La declaración SQL anterior consulta todos los registros asociados con Tab2 en Tab1 y db2.mdb (en la carpeta actual) en la base de datos actual.
Desventajas: las bases de datos externas no pueden tener contraseñas.
Suplemento: vi la respuesta de ugvanxk en una publicación y puedo usarla
Seleccione * de [c:/aa/a.mdb;pwd=1111].table1;
Prueba de ACCESS XP superada
Acceda a otras fuentes de datos ODBC en ACCESS
El siguiente ejemplo consulta los datos en SQLSERVER en ACCESS
SELECCIONAR * DE Tab1 EN [ODBC]
[ODBC;Controlador=SQL Server;UID=sa;PWD=;Servidor=127.0.0.1;Base de datos=Demo;]
Los parámetros completos de la propiedad de conexión de fuente de datos externa son:
[ODBC;DRIVER=controlador;SERVIDOR=servidor;DATABASE=base de datos;UID=usuario;PWD=contraseña;]
DRIVER=el controlador se puede encontrar en el registro
HKEY_LOCAL_MACHINE/SOFTWARE/ODBC/ODBCINST.INI/
encontrado en
Para importar datos entre bases de datos heterogéneas, consulte Blue Blood Sword
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1691966
ACCESS admite subconsultas
ACCESS admite uniones externas, pero no incluye uniones externas completas. Si es compatible,
UNIRSE A LA IZQUIERDA o UNIRSE A LA DERECHA
pero no es compatible
UNIÓN EXTERNA COMPLETA o UNIÓN COMPLETA
Consulta de fecha en ACCESS
Nota: El separador de fecha y hora en ACCESS es # en lugar de comillas
Seleccione * Desde Tab1 Donde [Fecha]>#2002-1-1#;
En DELPHI uso esto
SQL.Add(Formato(
'Seleccione * de la pestaña 1 donde [Fecha]>#%s#;',
[FechaToStr(Fecha)]));
Las cadenas en ACCESS se pueden separar con comillas dobles, pero SQLSERVER no las reconoce, por lo que, para facilitar la migración y la compatibilidad,
Se recomienda utilizar comillas simples como delimitadores de cadenas.