Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Conexión con bases de datos (https://www.clubdelphi.com/foros/forumdisplay.php?f=2)
-   -   cambiar base de datos por código sin usar ODBC (https://www.clubdelphi.com/foros/showthread.php?t=62969)

Nharkor 23-01-2009 13:00:46

cambiar base de datos por código sin usar ODBC
 
Vereis, me han pasado una aplicación desarrollada con el Delphi 7 y tengo que realizar algunos cambios. El problema es que jamás he usado Delphi. Aun así puedo seguir el código bastante bien.
El caso es que la aplicación utiliza una base de datos Acces. En toda la aplicación se utiliza un alias "BDEVACOM" para referirse a ella. Este alias se corresponde con un ODBC creado en el sistema que apunta a una base de datos concreta: "D:\Evacom\cof.mdb".

Yo lo que quiero permitir que el usuario elija la base de datos que quiera (un fichero ".mbd" de Access) de una lista, o sea que no puedo tener la base de datos "fijada", la tengo que poder cambiar por código dinámicamente.

Por lo que veo las consultas SQL se hacen con TQuery y he visto lineas de este estilo:


query.DataBaseName:='BDEVACOM'
Pero yo necesito algo como esto:
query.DataBasename = RutaMDB
o sea, poder indicar un ".mdb" cualquiera.
Esto seria lo ideal. La otra opción sería poder cambiar el ".mdb" asociado al ODBC por código.
Agradeceria cualquier ayuda al respecto porque estoy bloqueado, sin poder avanzar.
Un saludo.

Neftali [Germán.Estévez] 23-01-2009 13:34:47

En tu caso creo que lo que necesitas es modificar ese Alias ("BDEVACOM") por código.
Si buscas en los foros, seguro que encuentras más soluciones; Yo por lo pronto he encontrado este hilo y este otro, aunque seguro que hay más...

Esa configuración posiblemente no es la más adecuada (visto a día de hoy)[NOTA**]; Con esto quiero decir, que si en un futuro piensas seguir haciendo cambios en la aplicación, posiblemente puedas (y te interese) modificar el sistema de conexión a la Base de Datos o incluso la Base de Datos, pero eso es "otro cantar"; Si es así, dilo y seguro que el enfoque es otro. Si lo que necesitas son los cambios mínimos para conseguir lo que explicas "sin tener que tocar mucho código" creo que lo de arriba te será más que suficiente.

[NOTA**]: Delphi7 + Access + BDE(ODBC)

coso 23-01-2009 20:34:47

Hola, te dejo este codigo (ya antiguo). Con el puedes borrar y crear alias, etc...

Código Delphi [-]
unit odbcacces;


interface
        function AddDSN(const DSN, Database, Description: String): Boolean;
        function RemoveDSN(const DSN: String): Boolean;
        function RepairDB(const Database: String): Boolean;
        function CompactDB(const Database1, Database2: String): Boolean;

implementation

uses
        Windows, sysutils;


const ODBC_ADD_DSN = 1; // Add data source
      ODBC_CONFIG_DSN = 2; // Configure (edit)data source
      ODBC_REMOVE_DSN = 3; // Remove data source
      ODBC_ADD_SYS_DSN = 4; // add a system DSN
      ODBC_CONFIG_SYS_DSN = 5; // Configure a system DSN
      ODBC_REMOVE_SYS_DSN = 6; // remove a system DSN ODBC_REMOVE_DEFAULT_DSN = 7; // remove the default DSN

function SQLConfigDataSource( hwndParent: HWND; fRequest: WORD; lpszDriver: LPCSTR;
lpszAttributes: LPCSTR): BOOL; stdcall; external 'ODBCCP32.DLL';

function AddDSN(const DSN, Database, Description: String): Boolean; begin Result :=
SQLConfigDataSource(0, ODBC_ADD_DSN, 'Microsoft Access Driver (*.mdb)', PChar( 'DSN='
+ DSN + #0 + 'Driver=ODBCJT32.DLL'#0 + 'DBQ=' + Database + ''#0 + 'DefaultDir=' +
ExtractFilePath(Database) + #0 + 'Description=' + Description + #0 + 'FIL=MSAccess'#0 + 'UID=Admin'#0)); end;

function RemoveDSN(const DSN: String): Boolean; begin Result :=
SQLConfigDataSource(0, ODBC_REMOVE_DSN, 'Microsoft Access Driver (*.mdb)', PChar(
'DSN=' + DSN + #0)); end;

function RepairDB(const Database: String): Boolean; begin Result :=
SQLConfigDataSource(0, ODBC_ADD_DSN, 'Microsoft Access Driver (*.mdb)', PChar(
'REPAIR_DB=' + Database + #0 + 'UID=Admin'#0 + 'PWD=PWSWAN'#0)); end;

function CompactDB(const Database1, Database2: String): Boolean; begin Result :=
SQLConfigDataSource(0, ODBC_ADD_DSN, 'Microsoft Access Driver (*.mdb)', PChar(
'COMPACT_DB=' + Database1 + ' ' + Database2 + ' General'#0 + 'UID=Admin'#0 +
'PWD='#0)); end;

end.

Asi, si quieres 'cargar' una base de datos, tansolo tendras que borrar y recrear el alias. Te recomiendo, de todas maneras, que pases a ADO o a SQL, pues estas cosas se simplifican mucho. Saludos.

fjcg02 24-01-2009 14:58:54

Pon este código en el FormCreate

Código Delphi [-]
   Conexion.Connected:= False;
   Conexion.ConnectionString:='Provider=Microsoft.Jet.OLEDB.4.0;Password="";User ID=Admin;' +
     'Data Source= '+ wdatos+'Presupuestos.mdb;';
database="";Jet OLEDB:Registry Path="";Jet OLEDB:Database Password="";Jet OLEDB:Engine Type=5;Jet OLEDB:Database Locking Mode=1;Jet OLEDB:Global Partial Bulk Ops=2;Jet OLEDB:Global Bulk Transactions=1;Jet OLEDB:New Database Password="";Jet OLEDB:Create System Database=False;Jet OLEDB:Encrypt Database=False;Jet OLEDB:Don''t Copy Locale on Compact=False;Jet OLEDB:Compact Without Replica Repair=False;Jet OLEDB:SFP=False';
De esta manera no se utiliza odbc, sino que se utiliza JetOleDB. Así se manipula la cadena de conexión del TADODatabase.
wdatos es el directorio donde está el mdb. Yo lo pongo en este procedimiento porque indico en un ini el directorio del mdb. No creo que te cueste demasiado adaptarlo para que seleccione el mdb el propio usuario.
Por otro lado puedes generar la cadena de conexión y revisarla con cualquier editor de texto.

Saludos

Nharkor 27-01-2009 14:55:49

Muchisimas gracias a todos. Voy a probar vuestras ideas a ver si me funciona.


La franja horaria es GMT +2. Ahora son las 22:50:20.

Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi