1. Operar la base de datos de acceso en Delphi (crear un archivo .mdb, comprimir la base de datos)
El siguiente código ha sido probado en win2k, d6 y mdac2.6.
El programa compilado se ejecuta correctamente en la segunda versión de win98 sin entorno de acceso.
//antes de usar comobj,activex
//Declarar la cadena de conexión
constante
cadena de conexión = 'proveedor=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 char;
comenzar
gettemppath(254,spath);
gettempfilename(spath,'~sm',0,sfile);
resultado:=archivo;
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 acceso, falla si el archivo existe
var
nombredearchivotemp:cadena;
vcatalog:olevariante;
comenzar
stempfilename:=gettemppathfilename;
intentar
vcatalog:=createoleobject('adox.catalog');
vcatalog.create(formato(cadena de conexión,[nombre de archivo temporal,contraseña]));
resultado:=copyfile(pchar(stempfilename),pchar(filename),true);
eliminararchivo(nombredelarchivotemp);
excepto
resultado:=falso;
fin;
fin;
//================================================== ==============================
// procedimiento: base de datos compacta
// autor: ysai
// fecha: 2003-01-27
// argumentos: un nombre de archivo, una contraseña: cadena
// resultado: booleano
//================================================== ==============================
función base de datos compacta (un nombre de archivo, una contraseña: cadena): booleano;
//Comprimir y reparar la base de datos, sobrescribir los archivos fuente
var
nombredearchivotemp:cadena;
vje:olevariante;
comenzar
stempfilename:=gettemppathfilename;
intentar
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(formato(cadena de conexión,[unnombre de archivo,unacontraseña]),
formato (cadena de conexión, [nombre de archivo temporal, contraseña]));
resultado:=copyfile(pchar(stempfilename),pchar(afilename),false);
eliminararchivo(nombredelarchivotemp);
excepto
resultado:=falso;
fin;
fin;
//================================================== ==============================
// procedimiento: cambiar la contraseña de la base de datos
// autor: ysai
// fecha: 2003-01-27
// argumentos: un nombre de archivo, una contraseña antigua, una nueva contraseña: cadena
// resultado: booleano
//================================================== ==============================
función cambiar contraseña de base de datos (un nombre de archivo, una contraseña antigua, una contraseña nueva: cadena): booleano;
//Modificar contraseña de acceso a la base de datos
var
nombredearchivotemp:cadena;
vje:olevariante;
comenzar
stempfilename:=gettemppathfilename;
intentar
vje:=createoleobject('jro.jetengine');
vje.compactdatabase(formato(cadena de conexión,[un nombre de archivo,una contraseña antigua]),
formato (cadena de conexión, [nombre de archivo temporal, nueva contraseña]));
resultado:=copyfile(pchar(stempfilename),pchar(afilename),false);
eliminararchivo(nombredelarchivotemp);
excepto
resultado:=falso;
fin;
fin;
2. Cosas a las que debes prestar atención y algunos consejos al utilizar sentencias SQL en el acceso
La siguiente declaración SQL pasó la prueba en la consulta de Access XP
Crear tabla:
crear tabla tab1 (
contador de identificación,
cadena de nombre,
edad entera,
[fecha] fechahora);
Habilidad:
Los campos de incremento automático se declaran con contador.
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 de fecha de tab1
crear índice idate en la pestaña1 ([fecha]);
Una vez completado, el atributo de índice de fecha del campo en acceso se muestra como - Sí (hay duplicados).
La siguiente declaración crea un índice no repetible en la columna de nombre de tab1
crear un índice único en la pestaña1 (nombre);
Una vez completado, el atributo de índice del nombre del campo en el acceso se muestra como Sí (sin duplicación).
La siguiente declaración elimina los dos índices recién creados.
colocar la fecha del índice en la pestaña1;
colocar el nombre del índice en la pestaña1;
Comparación de declaraciones de actualización en access y sqlserver:
Declaración de actualización para actualizar varias tablas en sqlserver:
actualizar pestaña 1
establecer a.nombre = b.nombre
desde pestaña1 a, pestaña2 b
donde a.id = b.id;
La declaración SQL con la misma función en el acceso debe ser
actualizar pestaña1 a, pestaña2 b
establecer a.nombre = b.nombre
donde a.id = b.id;
Es decir: la declaración de actualización en el acceso no tiene una cláusula de y todas las tablas a las que se hace referencia se enumeran después de la palabra clave de actualización.
En el ejemplo anterior, si tab2 no es una tabla, sino una consulta, por ejemplo:
actualizar tab1 a, (seleccione id, nombre de tab2) b
establecer a.nombre = b.nombre
donde a.id = b.id;
Acceda a múltiples bases de datos de acceso diferentes: use 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 acceso xp aprobada
Acceder a otras fuentes de datos odbc en acceso
El siguiente ejemplo consulta datos en sqlserver en acceso
seleccione * de la pestaña 1 en [odbc]
[odbc;controlador=servidor sql;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;controlador=controlador;servidor=servidor;base de datos=base de datos;uid=usuario;pwd=contraseña;]
El controlador = 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
el acceso admite subconsultas
El acceso admite uniones externas, pero no incluye uniones externas completas, si se admiten.
unión izquierda o unión derecha
pero no es compatible
unión externa completa o unión completa
Consulta de fecha en acceso
Nota: El separador de fecha y hora en acceso es # en lugar de comillas
seleccione * de la pestaña 1 donde [fecha]>#2002-1-1#;
En Delphi uso esto.
sql.add(formato(
'seleccione * de la pestaña1 donde [fecha]>#%s#;',
[datetostr(fecha)]));
Las cadenas en el acceso 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.