Utilice ADO para operar la base de datos ACCESS en VC
ADO (ActiveX Data Object) es una nueva interfaz para el desarrollo de aplicaciones de bases de datos de Microsoft. Es una tecnología de acceso a bases de datos de alto nivel basada en OLE DB. Incluso si no comprende OLE DB y COM. Puede lidiar fácilmente con ADO porque es muy simple y fácil de usar, incluso más fácil de usar que la API ODBC, DAO y RDO con los que ha estado en contacto antes, sin perder flexibilidad. Este artículo presenta en detalle cómo utilizar ADO para desarrollar aplicaciones de bases de datos en el entorno de desarrollo Visual C y proporciona código de muestra. Para permitir que los lectores y amigos prueben el código proporcionado en este ejemplo, utilizamos la base de datos de Access. Puede encontrar este test.mdb directamente en el código de muestra que proporcionamos. El efecto después de compilar y ejecutar el programa se muestra en la Figura 1:
1. Método de implementación
Todo es difícil al principio. Lo más importante para los principiantes con cualquier tecnología nueva. es "empezar" ", comprenda sus puntos clave. ¡Echemos un vistazo al proceso básico del desarrollo de bases de datos ADO! Sus pasos básicos son los siguientes:
(1) Inicializar la biblioteca COM e introducir el archivo de definición de la biblioteca ADO
(2) Usar el objeto Conexión para conectarse a la base de datos
(3) Utilice la conexión establecida para ejecutar comandos SQL a través de los objetos Conexión y Comando, o utilice el objeto Recordset para obtener el conjunto de registros de resultados para consulta y procesamiento.
(4) Cierre la conexión y suelte el objeto después de su uso.
A continuación, presentaremos los pasos anteriores en detalle y proporcionaremos el código relevante.
1. Inicialización de la biblioteca COM
Podemos usar AfxOleInit() para inicializar la biblioteca COM. Este trabajo generalmente se realiza en la función sobrecargada de CWinApp::InitInstance(), por favor. Mire el siguiente código:
BOOL CADOTest1App::InitInstance()
{
AfxOleInit();
.... ..
}
2. Utilice la directiva #import para introducir la biblioteca de tipos ADO
Para introducir la biblioteca de tipos ADO, debe agregar la siguiente declaración al archivo stdafx.h del proyecto:
#import "c:program filescommon filessystemadomsado15.dll"
no_namespace rename("EOF", "adoEOF")
¿Qué significa esta afirmación? ¿Paño de lana? Su función final es similar a #include con el que ya estamos muy familiarizados. Al compilar, el sistema generará dos archivos de encabezado C msado15.tlh y ado15.tli para que definamos la biblioteca ADO.
Los lectores deben prestar atención a: msado15.dll en su entorno de desarrollo puede no estar en este directorio. Modifíquelo de acuerdo con la situación real. La siguiente advertencia puede aparecer durante la compilación. MSDN Se explica y sugiere que ignoremos esta advertencia: msado15.tlh(405): advertencia C4146: operador menos unario aplicado al tipo sin firmar, el resultado aún sin firmar.
3. Cree un objeto Connection y conéctese a la base de datos
Para agregar primero un puntero al objeto Connection _ConnectionPtr m_pConnection, el siguiente código demuestra cómo crear una instancia del objeto Connection. y cómo conectar la base de datos y la captura de excepciones:
BOOL CADOTest1Dlg::OnInitDialog()
{
CDialog::OnInitDialog();
HRESULT hr;
try
{
hr = m_pConnection.CreateInstance("ADODB.Connection"); ///Crear objeto de conexión
if(SUCCEEDED(hr))
{
hr = m_pConnection-Open("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source= test.mdb", "", "", adModeUnknown); ///Conéctese a la base de datos
//El proveedor en la cadena de conexión en la oración anterior es para el entorno ACCESS2000, para ACCESS97,
//Debe cambiarse a: Provider=Microsoft.Jet.OLEDB.3.51;
}
}
catch(_com_error e)/// Detectando excepción
{
CString errormessage;
errormessage.Format("¡Error al conectarse a la base de datos! Mensaje de error: s ", e.ErrorMessage());
AfxMessageBox(errormessage);///Mostrar mensaje de error
}
En este código nos conectamos a la base de datos a través del método Open del objeto Connection, el siguiente es el prototipo de este método:
HRESULT Connection15::Open (_bstr_t ConnectionString, _bstr_t UserID, _bstr_t Contraseña, opciones largas);
El parámetro ConnectionString en la función anterior es la cadena de conexión; el parámetro UserID es el nombre de usuario; el parámetro Contraseña es la contraseña de inicio de sesión; el parámetro Opciones es la opción de conexión, que se utiliza para especificar el permiso de actualización del objeto Conexión; los datos Generalmente, las Opciones pueden ser las siguientes constantes:
adModeUnknown: predeterminado.
Los permisos actuales no están configurados
adModeRead: solo lectura
adModeWrite: solo escritura
adModeReadWrite: puede leer y escribir
adModeShareDenyRead: Bloquear que otros objetos Connection abran conexiones con permisos de lectura
adModeShareDenyWrite: evita que otros objetos Connection abran conexiones con permisos de escritura
adModeShareExclusive: evita que otros objetos Connection abran conexiones con permisos de lectura y escritura
adModeShareDenyNone: evita que otros objetos de conexión abran conexiones con cualquier permiso
Le brindamos algunos métodos de conexión comúnmente utilizados para su referencia:
(1) Base de datos ACCESS2000 a través de JET Conexión del motor de base de datos:
m_pConnection-Open("Provider=Microsoft.Jet.OLEDB.4.0;
Data Source=C:est.mdb","","",adModeUnknown );
(2) Conéctese a cualquier base de datos que admita ODBC a través de la fuente de datos DSN:
m_pConnection-Open("Data Source=adotest;UID=sa;PWD=;", " ","",adModeUnknown);
(3) Conéctese a la base de datos de SQL SERVER sin DSN:
m_pConnection-Open("driver={SQL Server}; Server=127.0 .0.1; DATABASE=vckbase;
UID=sa;PWD=139","","",adModeUnknown);
Donde Servidor es el nombre del servidor SQL y BASE DE DATOS es el nombre de la biblioteca.
El objeto Connection tiene muchos métodos además del método Open(). Primero presentamos las dos propiedades útiles ConnectionTimeOut y State en el objeto Connection. ConnectionTimeOut se utiliza para establecer el tiempo de espera de la conexión y debe llamarse antes de abrir, por ejemplo:
m_pConnection-ConnectionTimeout = 5 ///Establecer el tiempo de espera en 5 segundos
m_pConnection-Open( "Data Source=adotest;","","",adModeUnknown);
El atributo Estado indica el estado del objeto Conexión actual 0 significa cerrado, 1 significa abierto. lea esta propiedad para realizar el procesamiento correspondiente, por ejemplo:
if(m_pConnection-State)
m_pConnection-Close() ///Si la conexión ya está abierta, ciérrela<; /p>
4. Ejecute el comando SQL y obtenga el conjunto de registros de resultados
Para obtener el conjunto de registros de resultados, definimos un puntero al objeto Recordset: _RecordsetPtr m_pRecordset;
Y cree un objeto Recordset para ello. Ejemplo: m_pRecordset.CreateInstance("ADODB.Recordset"), la ejecución de comandos SQL puede tomar muchas formas, las explicaremos una por una a continuación.
(1) Utilice el método Execute del objeto Connection para ejecutar comandos SQL
El prototipo del método Execute() es el siguiente:
_RecordsetPtr Connection15 ::Ejecutar (_bstr_t CommandText, VARIANT * RecordsAffected, opciones largas)
Donde CommandText es la cadena de comando, generalmente un comando SQL. El parámetro RecordsAffected es el número de filas afectadas una vez completada la operación. El parámetro Opciones indica el tipo de contenido en CommandText. Las opciones pueden tomar uno de los siguientes valores: adCmdText indica que CommandText es un comando de texto; nombre de la tabla; adCmdProc indica que CommandText es un proceso de almacenamiento; adCmdUnknown indica que el contenido de CommandText es desconocido.
Después de ejecutar la función Execute(), devuelve un puntero al conjunto de registros. A continuación damos el código específico y la explicación:
_variant_t RecordsAffected;
///Ejecutar SQL. comando: CREATE TABLE crea la tabla usuarios. Usuarios contiene cuatro campos: ID de número entero, nombre de usuario de cadena, número entero antiguo, tipo de fecha de cumpleaños
m_pConnection-Execute("Usuarios de CREATE TABLE(ID INTEGER, nombre de usuario
TEXTO, INTEGER antiguo, cumpleaños DATETIME)", RecordsAffected, adCmdText);
///Agregar registros a la tabla
m_pConnection-Execute("INSERT INTO users(ID , nombre de usuario, edad, fecha de nacimiento)
VALUES (1, 'Washington', 25, '1970/1/1')", RecordsAffected, adCmdText);
///Convertir todos los registros Agregue uno al valor del campo anterior
m_pConnection-Execute("UPDATE users SET old = old 1", RecordsAffected, adCmdText);
///Ejecute el SQL comando de estadísticas para obtener la barra de registros Número de conjuntos de registros
m_pRecordset = m_pConnection-Execute("SELECT COUNT(*) FROM
usuarios", RecordsAffected, adCmdText);
_variant_t vIndex = (long)0;
_variant_t vCount = m_pRecordset-GetCollect(vIndex); ///Obtiene el valor del primer campo y lo coloca en la variable vCount
m_pRecordset-Close(); /// /Cerrar el conjunto de registros
CString message;
message.Format("***Hay d registros", vCount.lVal) ;
AfxMessageBox(message); /// Muestra el número actual de registros (2) Utilice el objeto Command para ejecutar comandos SQL
_CommandPtr m_pCommand;
m_pCommand.CreateInstance("ADODB.Command");
p>
_variant_t vNULL;
vNULL.vt = VT_ERROR;
vNULL.scode = DISP_E_PARAMNOTFOUND; /// Definido como sin parámetros
m_pCommand- ActiveConnection = m_pConnection; /// Una frase muy crítica, asígnale la conexión establecida
m_pCommand-CommandText = "SELECT * FROM usuarios"; ///Cadena de comando
m_pRecordset = m_pCommand-Execute(vNULL, vNULL, adCmdText);
//Ejecuta el comando para obtener el conjunto de registros
>
En este código, solo usamos el objeto Command para ejecutar la instrucción de consulta SELECT. El objeto Command realmente puede reflejar su función al llamar a procedimientos almacenados. Entraremos en detalles la próxima vez.
(3) Utilice directamente el objeto Recordset para consultar y obtener el conjunto de registros, por ejemplo:
m_pRecordset-Open("SELECT * FROM users", _variant_t((IDispatch *) m_pConnection, true) ,
adOpenStatic, adLockOptimistic, adCmdText);
El prototipo del método Open() es el siguiente:
HRESULT Recordset15:: Open ( const _variant_t
Fuente, const _variant_t
ActiveConnection, enum CursorTypeEnum CursorType, enum LockTypeEnum LockType, long Opciones)
El parámetro Fuente en la función anterior es el cadena de consulta de datos; se ha establecido el parámetro ActiveConnection Conexión (necesitamos usar el puntero del objeto Conexión para construir un objeto _variant_t); tipo de cursor del parámetro CursorType, que puede ser uno de los siguientes valores, consulte esta estructura de enumeración:
enum CursorTypeEnum
{
adOpenUnspecified = -1, ///Sin especificación especial
adOpenForwardOnly = 0, ///Avanzar el estático cursor. Este cursor solo puede explorar el registro establecido hacia adelante, como usar MoveNext para desplazarse hacia adelante. Este método puede aumentar la velocidad de navegación. Sin embargo, BookMark, RecordCount, AbsolutePosition y AbsolutePage no se pueden usar
adOpenKeyset = 1, /// El conjunto de registros que usa este cursor no puede ver las operaciones de adición y eliminación de otros usuarios, sino para actualizar el Grabado original las acciones son visibles para usted.
adOpenDynamic = 2, /// Cursor dinámico. Todas las operaciones de la base de datos se reflejan inmediatamente en cada conjunto de registros de usuario.
adOpenStatic = 3 ///Cursor estático. Genera una copia de seguridad estática para su conjunto de registros, pero las operaciones de adición, eliminación y actualización de otros usuarios son invisibles para su conjunto de registros.
};
El parámetro LockType representa el tipo de bloqueo de la base de datos. Puede ser uno de los siguientes valores. Consulte la siguiente estructura de enumeración:
. enum LockTypeEnum
p>{
adLockUnspecified = -1, ///Sin especificar
adLockReadOnly = 1, ///Conjunto de registros de solo lectura
adLockPessimistic = 2. Método de bloqueo pesimista. Los datos bloquean todas las demás acciones durante la actualización. Este es el mecanismo de bloqueo más seguro
adLockOptimistic = 3, método de bloqueo optimista. El registro solo se bloquea cuando llama al método Actualizar. Antes de esto, aún se pueden realizar actualizaciones de datos, inserciones, eliminaciones y otras acciones
adLockBatchOptimistic = 4, actualización por lotes optimista. Los registros no se bloquean durante la edición y los cambios, inserciones y eliminaciones se realizan en modo por lotes.
};
Para conocer el significado del parámetro Opciones, consulte la introducción al método Execute() del objeto Conexión en este artículo.
5. Recorrer y actualizar el conjunto de registros
Según la tabla de usuarios que acabamos de crear ejecutando el comando SQL, contiene cuatro campos: ID, nombre de usuario, antigüedad, fecha de nacimiento
p> p>
La siguiente implementación de código: abra el conjunto de registros, recorra todos los registros, elimine el primer registro, agregue tres registros, mueva el cursor al segundo registro, cambie sus datos de edad y guárdelo en la base de datos.
_variant_t vUsername, vBirthday, vID, vOld;
_RecordsetPtr m_pRecordset
m_pRecordset.CreateInstance("ADODB.Recordset"); >m_pRecordset-Open("SELECT * FROM usuarios", _variant_t((IDispatch*)m_pConnection, true),
adOpenStatic, adLockOptimistic, adCmdText
while(!m_pRecordset-adoEOF); )
///¿Por qué es adoEOF en lugar de EOF? ¿Recuerdas la oración rename("EOF", "adoEOF")?
{
vID = m_pRecordset-GetCollect(_variant_t((long)0));///Obtiene el valor de la columna 1, contando desde 0, también puedes dar directamente el nombre de la columna;
vUsername = m_pRecordset -GetCollect("username"); ///Obtener el valor del campo de nombre de usuario
vOld = m_pRecordset-GetCollect("old");
vBirthday = m_pRecordset-GetCollect(" cumpleaños ");
///Envíe los registros en el conjunto de registros en la ventana SALIDA en modo DEPURACIÓN
if(vID.vt != VT_NULL
vUsername.vt != VT_NULL
vOld.vt != VT_NULL
vBirthday.vt != VT_NULL)
TRACE("id: d, nombre: s , edad: d, cumpleaños: s ", vID.lVal, (LPCTSTR) (_bstr_t) vUsername, vOld.lVal, (LPCTSTR) (_bstr_t) vBirthday);
m_pRecordset-MoveNext(); // /Mover al siguiente registro
}
m_pRecordset-MoveFirst(); ///Mover al primer registro
m_pRecordset-Delete(adAffectCurrent); /Eliminar registro actual
///Agregar tres nuevos registros y asignar valores
for(int i=0; i3; i)
{
m_pRecordset-AddNew(); ///Agregar nuevo registro
m_pRecordset-PutCollect("ID",_variant_t((long)(i 10)));
m_pRecordset-PutCollect ("nombre de usuario",_variant_t("Yelchin"));
m_pRecordset-PutCollect("old",_variant_t((long)71));
m_pRecordset-PutCollect ("cumpleaños",_variant_t("1930-3-15"));
}
m_pR
ecordset-Move(1,_variant_t((long)adBookmarkFirst));///Mover un registro hacia abajo desde el primer registro, es decir, pasar al segundo registro
m_pRecordset-PutCollect(_variant_t( "old "), _variant_t((long)45)); ///Modificar su antigüedad
m_pRecordset-Update(); ///Guardar en la biblioteca
6. Cerrar conjuntos de registros y conexiones
Los conjuntos de registros o conexiones se pueden cerrar usando el método Close():
m_pRecordset-Close() ///Cerrar el conjunto de registros
; m_pConnection-Close(); /// Cerrar la conexión
En este punto, creo que los lectores ya están familiarizados con el proceso general de operar la base de datos con ADO. Tal vez ya esté seguro, tal vez todavía lo esté. un poco confundido, ¡no importa! Le sugiero que intente escribir algunos ejemplos para que pueda familiarizarse más con ADO. Finalmente, escribí un pequeño ejemplo para usted. La función del ejemplo es leer todos los registros y colocarlos en un control de lista. Al mismo tiempo, puede agregar, eliminar y modificar registros.
2. Pasos de programación
1. Inicie Visual C 6.0, genere un programa de aplicación basado en diálogo y nombre el programa ADOTest1.
2. control de lista de registros y controles de edición y botones para agregar y eliminar registros en la interfaz del cuadro de diálogo. Configure específicamente la parte de recursos del cuadro de diálogo en el código.
3. una función de respuesta de mensaje al botón registrado en la base de datos;
4. Agréguelo al código del programa, compílelo y ejecútelo.