//---------------------------------------------------------------------------
// CrearDSNAccess
// Esta función crea un Nombre de Origen de Datos para poder establecer una
// conexión via ODBC con una base de datos Access.
// Si el DSN ya existe con anterioridad, se modifica la ruta al archivo MDB
// si esta fuera diferente.
//
// Parámetros:
// stNombreDSN : Nombre para el origen de datos
// stDescripcion : Descripción del origen de datos, puede ser una
// cadena vacia
// stPathArchivoMDB : Ruta completa al archivo MDB
// bEsSistema : true si queremos crear un DSN de sistema o false si
// queremos un DSN de usuario
//
// Notas: Es necesario incluir la cabecera "Registry.hpp"
//---------------------------------------------------------------------------
void CrearDSNAccess(String stNombreDSN, String stDescripcion,
String stPathArchivoMDB, bool bEsSistema)
{
TRegistry* reg = new TRegistry;
try
{
// Escogemos si queremos un DSN de sistema o usuario
if (bEsSistema)
reg->RootKey = HKEY_LOCAL_MACHINE;
else
reg->RootKey = HKEY_CURRENT_USER;
// Abrimos la clave que contiene las cadenas con los DSN instalados.
reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\ODBC Data Sources", true);
// Comprobamos si existe nuestro DSN, es decir, si al leer se devuelve ""
// significa que el DSN no existe y hay que crearlo.
if (reg->ReadString(stNombreDSN) == "")
{
// No existe una entrada para este DSN, por lo tanto hay que crearla.
reg->WriteString(stNombreDSN, "Microsoft Access Driver (*.mdb)");
// Creamos también una SubClave para contener los parámetros del DSN
reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN, true);
// Escribimos los datos necesarios
reg->WriteString("DBQ", stPathArchivoMDB);
reg->WriteString("Description", stDescripcion);
// Tenemos que poner el path completo a la DLL odbcjt32.dll. Esta se
// encuentra en el directorio Windows\System en Win9x/Me ó en
// Winnt\System32 en NT/2000
String stPathSystem = "";
stPathSystem.SetLength(MAX_PATH);
stPathSystem.SetLength(GetSystemDirectory(stPathSystem.c_str(), MAX_PATH));
reg->WriteString("Driver", stPathSystem + "\\odbcjt32.dll");
reg->WriteInteger("DriverId", 25);
reg->WriteString("FIL", "MS Access");
reg->WriteInteger("SafeTransactions", 0);
reg->WriteString("UID", "");
// Creamos otra subclave para contener más información propia del driver
// de Access.
reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN+"\\Engines\\Jet",
true);
reg->WriteString("ImplicitCommitSync", "");
reg->WriteInteger("MaxBufferSize", 2048);
reg->WriteInteger("PageTimeout", 32);
reg->WriteInteger("Threads", 3);
reg->WriteString("UserCommitSync", "Yes");
}
else // El DSN ya existe.
{
// Abrimos la Subclave que contiene información sobre el DSN
reg->OpenKey("\\Software\\ODBC\\ODBC.INI\\"+stNombreDSN, true);
// Comprobamos si el path es el mismo para actualizarlo.
if (reg->ReadString("DBQ") != stPathArchivoMDB)
reg->WriteString("DBQ", stPathArchivoMDB);
}
}
__finally
{
delete(reg);
}
}
|