Mi problema es el siguiente: Yo siempre que he necesitado crear una aplicación apoyada sobre una base de datos, ésta era local, pero ahora necesito que el programa esté en un ordenador, estando la base de datos en un servidor. Yo hago lo mismo, agrego una clase "Consumidor ODBC MFC" y pongo como destino \\\\www.servidor.com\\carpeta\\basedatos.mdb. Vale, todo correcto.
El problema es que al hacer la conexión me da un error de ASSERT y no se como solucionarlo, si hay que llamar a una función especial (por estar en el servidor) antes que llamar a Open, por favor que alguien me ayude. El código es el siguiente:
DB.H
Código:
DB.CPP// Datos3.h: declaración de CDatos3 #pragma once // código generado el lunes, 15 de septiembre de 2003, 21:33 class CDatos3 : public CRecordset { public: CDatos3(CDatabase* pDatabase = NULL); DECLARE_DYNAMIC(CDatos3) // Datos de campo o parámetro // Los tipos de cadena siguientes (si los hay) reflejan el tipo de datos real del // campo de base de datos: CStringA para tipos de datos ANSI y CStringW para tipos de datos // Unicode. Esto es para impedir que el controlador ODBC lleve a cabo conversiones // potencialmente innecesarias. Si lo desea, puede modificar estos miembros a // tipos CString y el controlador ODBC realizará las conversiones necesarias. // (Nota: la versión de controlador ODBC que debe utilizar es la 3.5 o posterior // para que admita tanto estas conversiones como las Unicode). long m_ID_USR; CStringW m_Nombre; CStringW m_Apellidos; CStringW m_Nick; CStringW m_Password; CStringW m_E_Mail; CStringW m_Pregunta; CStringW m_Respuesta; CStringW m_IP; CStringW m_Fecha; CStringW m_Hora; CStringW m_Intercambio; // unsupported m_Codigo; long m_Aceptado; // Reemplazos // El asistente generó reemplazos de funciones virtuales public: virtual CString GetDefaultConnect(); // Cadena de conexión predeterminada virtual CString GetDefaultSQL(); // código SQL predeterminado del conjunto de registros virtual void DoFieldExchange(CFieldExchange* pFX); // Compatibilidad con RFX // Implementación #ifdef _DEBUG virtual void AssertValid() const; virtual void Dump(CDumpContext& dc) const; #endif };
Código:
#include "stdafx.h" #include "Datos3.h" IMPLEMENT_DYNAMIC(CDatos3, CRecordset) CDatos3::CDatos3(CDatabase* pdb) : CRecordset(pdb) { m_ID_USR = 0; m_Nombre = L""; m_Apellidos = L""; m_Nick = L""; m_Password = L""; m_E_Mail = L""; m_Pregunta = L""; m_Respuesta = L""; m_IP = L""; m_Fecha = L""; m_Hora = L""; m_Intercambio = L""; m_Aceptado = 0; m_nFields = 14; m_nDefaultType = dynaset; } // #error Problema de seguridad: la cadena de conexión puede contener una contraseña // La cadena de conexión siguiente puede contener contraseñas de texto sin formato/u // otro tipo de información reservada. Quite #error después de revisar // la cadena de conexión relacionada con los problemas de seguridad. Puede que desee // almacenar la contraseña en otro formulario o utilizar una autenticación de usuario diferente. CString CDatos3::GetDefaultConnect() { return _T("DSN=MS Access Database;DBQ=\\\\http://www.destino.com\\data\\datos....erId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=500;UID=admin;"); } CString CDatos3::GetDefaultSQL() { return _T("[Datos]"); } void CDatos3::DoFieldExchange(CFieldExchange* pFX) { pFX->SetFieldType(CFieldExchange::outputColumn); // Las macros como RFX_Text() y RFX_Int() dependen del // tipo de variable miembro, no del tipo de campo de base de datos. // ODBC intentará convertir automáticamente el valor de columna en el tipo solicitado RFX_Long(pFX, _T("[ID_USR]"), m_ID_USR); RFX_Text(pFX, _T("[Nombre]"), m_Nombre); RFX_Text(pFX, _T("[Apellidos]"), m_Apellidos); RFX_Text(pFX, _T("[Nick]"), m_Nick); RFX_Text(pFX, _T("[Password]"), m_Password); RFX_Text(pFX, _T("[E_Mail]"), m_E_Mail); RFX_Text(pFX, _T("[Pregunta]"), m_Pregunta); RFX_Text(pFX, _T("[Respuesta]"), m_Respuesta); RFX_Text(pFX, _T("[IP]"), m_IP); RFX_Text(pFX, _T("[Fecha]"), m_Fecha); RFX_Text(pFX, _T("[Hora]"), m_Hora); RFX_Text(pFX, _T("[Intercambio]"), m_Intercambio); RFX_Long(pFX, _T("[Aceptado]"), m_Aceptado); } ///////////////////////////////////////////////////////////////////////////// // CDatos3 diagnostics #ifdef _DEBUG void CDatos3::AssertValid() const { CRecordset::AssertValid(); } void CDatos3::Dump(CDumpContext& dc) const { CRecordset::Dump(dc); } #endif //_DEBUG