Desarrollar aplicaciones de bases de datos con Visual C++(3)
6. Uso de ADO
6.1 Descripción general
ADO es un objeto de datos ActiveX, que es el método orientado a objetos de Microsoft para desarrollar nuevas aplicaciones de bases de datos. ADO accede a la base de datos accediendo al proveedor de datos OLE DB, proporcionando una interfaz de acceso simple de alto nivel al proveedor de datos OLE DB.
La tecnología ADO simplifica el funcionamiento de OLE DB. Los programas OLE DB utilizan una gran cantidad de interfaces COM y ADO encapsula estas interfaces. Por tanto, ADO es una tecnología de acceso de alto nivel.
La tecnología ADO se basa en el modelo de objetos común (COM), que proporciona tecnología de acceso en múltiples idiomas. Al mismo tiempo, debido a que ADO proporciona una interfaz de automatización de acceso, ADO puede utilizar el lenguaje de script descrito para acceder. VBScript, etc.
6.2 Usar ADO en VC
Puede usar el control ActiveX proporcionado por VC6 para desarrollar aplicaciones y también puede usar objetos ADO para desarrollar aplicaciones. El uso de objetos ADO para desarrollar aplicaciones puede facilitar que los desarrolladores de programas controlen el acceso a la base de datos, produciendo así programas de acceso a la base de datos que satisfagan las necesidades del usuario.
El uso de objetos ADO para desarrollar aplicaciones es similar a otras tecnologías. Requiere pasos como conectarse a fuentes de datos y crear registros. Sin embargo, lo que se diferencia de otras tecnologías de acceso es que la tecnología ADO no controla la jerarquía. y el orden entre objetos no es demasiado estricto. Durante el proceso de desarrollo del programa, no es necesario elegir establecer una conexión antes de generar objetos de registro, etc. Puede utilizar el objeto de registro directamente donde se utiliza el registro. Al crear el objeto de registro, el programa establece automáticamente una conexión con la fuente de datos. Este modelo simplifica efectivamente el diseño del programa y mejora la flexibilidad del programa. A continuación se describe cómo utilizar objetos ADO para programar.
6.21 Importación de archivos de la biblioteca ADO
Antes de usar ADO, debes utilizar el símbolo de importación directa #import para introducir el archivo de la biblioteca ADO en el archivo stdafx.h del proyecto para que el El compilador puede compilar correctamente. El código es el siguiente:
#define INITGUID
#import "c:program filescommon filessystemadomsado15.dll" no_namespace rename("EOF","EndOfFile")
#include "icrsint.h"
Esta línea de declaración declara que se usa ADO en el proyecto, pero no se usa el espacio de nombres ADO. Para evitar conflictos, se cambia el nombre de EOF a EndOfFile.
6.22 Inicializando el entorno ADO
El entorno COM debe inicializarse antes de utilizar el objeto ADO. La inicialización del entorno COM se puede completar con el siguiente código:
Después de inicializar el entorno COM, puede utilizar el objeto ADO. Si este código no se agrega delante del programa, se producirá un error COM.
Después de usar el objeto ADO, necesita usar el siguiente código para liberar el objeto inicializado:
Esta función borra el entorno COM preparado para el objeto ADO.
6.23 Introducción a las interfaces
La biblioteca ADO contiene tres interfaces básicas:
Interfaz __ConnectionPtr,
Interfaz __CommandPtr,
Interfaz __RecordsetPtr,
La interfaz __ConnectionPtr devuelve un conjunto de registros o un puntero nulo. Generalmente se usa para crear una conexión de datos o ejecutar una declaración SQL que no devuelve ningún resultado, como un procedimiento almacenado. No es una buena idea utilizar la interfaz __ConnectionPtr para devolver un conjunto de registros. Por lo general, como CDatabase, se utiliza para crear una conexión de datos y luego se utilizan otros objetos para realizar operaciones de entrada y salida de datos.
La interfaz __CommandPtr devuelve un conjunto de registros.
Proporciona una manera sencilla de ejecutar procedimientos almacenados y declaraciones SQL que devuelven conjuntos de registros. Cuando utilice la interfaz __CommandPtr, puede utilizar la interfaz global __ConnectionPtr o puede utilizar la cadena de conexión directamente en la interfaz __CommandPtr. Esta última es una mejor opción si sólo realiza una o unas pocas operaciones de acceso a datos. Pero si desea acceder a la base de datos con frecuencia y devolver muchos conjuntos de registros, debe usar la interfaz global __ConnectionPtr para crear una conexión de datos y luego usar la interfaz __CommandPtr para ejecutar procedimientos almacenados y declaraciones SQL.
__RecordsetPtr es un objeto de conjunto de registros. En comparación con los dos objetos anteriores, proporciona más funciones de control para el conjunto de registros, como bloqueo de registros, control del cursor, etc. Al igual que la interfaz __CommandPtr, no tiene que usar una conexión de datos ya creada. Puede usar una cadena de conexión en lugar del puntero de conexión y asignarla a la variable miembro de conexión de __RecordsetPtr para permitirle crear la conexión de datos por sí mismo. Si desea utilizar varios conjuntos de registros, la mejor manera es utilizar la interfaz global ConnectionPtr que ha creado una conexión de datos como el objeto Command y luego usar __Recordse7tPtr para ejecutar procedimientos almacenados y declaraciones SQL.
6.24 Utilice ADO para acceder a la base de datos
__ConnectionPtr es una interfaz de conexión. Primero cree una instancia de interfaz __ConnectionPtr y luego apunte y abra una fuente de datos ODBC o un proveedor de datos OLE DB (. Proveedor). El siguiente código crea una conexión de datos basada en DSN y no basada en DSN, respectivamente.
//Uso __ConnectionPtr (basado en DSN)
__ConnectionPtr MyDb;
MyDb.CreateInstance(__uuidof(Connection));
MyDb-〉Open("DSN=samp;UID=admin;PWD=admin","","",-1);
//Uso—ConnectionPtr (basado en no DSN) p>
__ConnectionPtr MyDb;
MyDb.CreateInstance(__uuidof(Conexión));
MyDb.Open("Provider=SQLOLEDB;SERVER=server;DATABASE=samp;UID =admin ;PWD=admin","","",-1);
//Utilice __RecordsetPtr para ejecutar sentencias SQL
__RecordsetPtr MySet;
MySet. CreateInstance(__uuidof(Recordset));
MySet->Open("SELECT *_ FROM some__table",
MyDb.GetInterfacePtr(),adOpenDynamic,adLockOptimistic,adCmdText);
p>Ahora que tenemos una conexión de datos y un conjunto de registros, podemos usar los datos. Como puede ver en el siguiente código, al usar la interfaz __RecordsetPtr de ADO, no necesita usar la estructura de datos grande y compleja VARIANT con tanta frecuencia como DAO y forzar la conversión de varios tipos de datos. Esta también es una de las ventajas de ADO.
Supongamos que el programa tiene un control ListBox llamado m__List. En el siguiente código, usamos la interfaz __RecordsetPtr para obtener los datos del conjunto de registros y completar este control ListBox:
__variant__t Holder
try. { while(!MySet -〉adoEOF)
{ Holder = MySet-〉GetCollect("FIELD__1");
if(Holder.vt!=VT__NULL)
m__List.AddString ((char_)__bstr__t(Holder));
MySet->MoveNext();} }
catch(__com__error _ e)
{ CString Error = e-〉ErrorMessage();
AfxMessageBox(e-〉ErrorMessage());
} catch(...)
{ MessageBox("ADO ¡Ocurrió un error!");}
Siempre debes usar try and catch en tu código para detectar errores de ADO; de lo contrario, los errores de ADO bloquearán tu aplicación. Cuando ocurre un error de ejecución en ADO (como que la base de datos no existe), el proveedor de datos OLE DB creará automáticamente un objeto __com__error y completará las variables miembro de este objeto con información de error relevante.
6.25 Conversión de tipos
Dado que los objetos COM son multiplataforma, utilizan un método común para procesar varios tipos de datos, por lo que la clase CString y los objetos COM son incompatibles, necesitamos una conjunto de API para convertir objetos COM y datos de tipo C++. __vatiant__t y __bstr__t son dos de esos objetos. Proporcionan métodos comunes para convertir objetos COM y datos de tipo C++.
6.3 Uso de ADO en VB
ADO proporciona formas de realizar las siguientes operaciones:
1. Al mismo tiempo, puede determinar si todos los cambios en la fuente de datos se realizaron correctamente o no.
2. Especificar el comando para acceder a la fuente de datos, con parámetros variables o ejecución optimizada.
3. Ejecute el comando.
3. Si este comando devuelve datos como filas en una tabla, almacene esas filas en un caché que pueda inspeccionarse, manipularse o cambiarse fácilmente.
4. Si corresponde, la fuente de datos se puede actualizar con cambios en la línea de caché.
5. Proporcionar métodos convencionales para detectar errores (generalmente causados al establecer una conexión o ejecutar un comando).
En un caso típico, todos estos pasos son necesarios en un modelo de programación. Sin embargo, debido a que ADO es muy flexible, al final sólo necesita ejecutar algunos módulos para realizar un trabajo útil.
Los siguientes elementos son partes clave del modelo de programación ADO:
6.31 Conexión
Se puede acceder a las fuentes de datos desde la aplicación a través de "conexiones", que son El entorno necesario para el intercambio de datos. El modelo de objetos utiliza objetos de conexión para concretar el concepto de conexiones.
"Transacción" se utiliza para definir el inicio y el final de una serie de operaciones de acceso a datos que ocurren durante el proceso de conexión. ADO deja claro que los cambios en la fuente de datos causados por operaciones dentro de una transacción ocurrieron exitosamente o no ocurrieron en absoluto. Si se cancela una transacción o una de sus operaciones falla, el resultado final será como si ninguna de las operaciones de la transacción hubiera ocurrido y la fuente de datos permanecerá en el estado en el que se encontraba antes de que comenzara la transacción. El modelo de objetos no representa claramente el concepto de transacciones, pero está representado por un conjunto de métodos de objetos de conexión. ADO accede a datos y servicios de proveedores OLE DB. Los objetos de conexión se utilizan para especificar proveedores especializados y parámetros arbitrarios.
6.32 Comandos
Los "comandos" emitidos a través de una conexión establecida pueden operar la fuente de datos de alguna manera.
Normalmente, los comandos agregan, eliminan o actualizan datos en una fuente de datos, o recuperan datos en formato de fila de una tabla. El modelo de objetos utiliza objetos Command para representar conceptos de comando. El uso del objeto Command permite a ADO optimizar la ejecución de comandos.
Parámetros
Por lo general, la parte variable requerida por un comando, los "parámetros", se pueden cambiar antes de emitir el comando. Por ejemplo, el mismo comando de recuperación de datos se puede emitir repetidamente, pero la información de recuperación especificada se puede cambiar cada vez.
Los parámetros son útiles para comandos ejecutables que son iguales a la actividad de la función, de modo que sepa qué hace el comando, pero no necesariamente cómo funciona. Por ejemplo, se puede emitir una orden de transferencia bancaria para prestar dinero de una parte a otra. El importe a transferir se puede establecer como parámetro.
El modelo de objetos utiliza objetos Parameter para reflejar el concepto de parámetro.
6.33 Conjunto de registros
Si el comando es una consulta que devuelve datos por fila de información en una tabla (una consulta de devolución de fila), estas filas se almacenarán localmente.
El modelo de objetos representa este almacenamiento como un objeto Recordset. Sin embargo, no hay ningún objeto que represente solo una fila de Recordset.
Los conjuntos de registros son el método principal para inspeccionar y modificar datos en filas.
6.34 Campos
Una fila de conjunto de registros contiene uno o más "campos". Si piensa en el conjunto de registros como una cuadrícula bidimensional, los campos están organizados en "columnas". Cada campo (columna) contiene atributos con un nombre, tipo de datos y valor. Es el valor que contiene los datos reales de la fuente de datos.
El modelo de objetos utiliza objetos Field para representar campos.
Para modificar los datos en la fuente de datos, puede modificar el valor del objeto Campo en la fila del conjunto de registros y los cambios en el conjunto de registros eventualmente se transmiten a la fuente de datos. Como opción, los métodos de gestión de transacciones del objeto Connection pueden garantizar de forma fiable que todos los cambios se realicen correctamente o todos fallen.
6.35 Errores
Los errores pueden ocurrir en cualquier momento en la aplicación, generalmente debido a la imposibilidad de establecer una conexión, ejecutar un comando o a algún estado (por ejemplo, al intentar utilice un conjunto de registros no inicializado) objetos para operar.
El modelo de objetos representa los errores como objetos Error.
Cualquier error generará uno o más objetos de Error, y los errores posteriores descartarán el grupo anterior de objetos de Error.
6.36 Propiedades
Cada objeto ADO tiene un conjunto único de "propiedades" para describir o controlar el comportamiento del objeto.
Existen dos tipos de propiedades: integradas y dinámicas. Las propiedades integradas son parte del objeto ADO y están fácilmente disponibles. Las propiedades dinámicas se agregan a la colección de propiedades del objeto ADO mediante un proveedor de datos especial y existen solo cuando se utiliza el proveedor.
El modelo de objetos utiliza objetos Property para representar propiedades.
6.37 Colecciones
ADO proporciona "colecciones", un tipo de objeto que puede contener convenientemente otros tipos especiales de objetos. Utilice métodos de colección para recuperar objetos de una colección por nombre (cadena de texto) o número (entero).
ADO proporciona cuatro tipos de colecciones:
El objeto Conexión tiene una colección Errores que contiene todos los objetos Error creados en respuesta a un único error relacionado con la fuente de datos.
El objeto Command tiene una colección de Parámetros que contiene todos los objetos Parameter que se aplican al objeto Command.
El objeto Recordset tiene una colección Fields, que contiene todos los objetos Field que definen las columnas del objeto Recordset.
Además, los objetos Conexión, Comando, Conjunto de registros y Campo tienen colecciones de Propiedades. Contiene todos los objetos de propiedad que pertenecen a cada objeto contenedor.
Los objetos ADO tienen propiedades en las que puede establecer o recuperar valores utilizando tipos de datos comunes como entero, carácter o booleano.
Sin embargo, es necesario considerar algunas propiedades como valores de retorno del tipo de datos "OBJETO DE COLECCIÓN". En consecuencia, los objetos de la colección tienen métodos para almacenar y recuperar otros objetos que encajan en la colección.
6.38 Eventos
ADO 2.0 admite eventos, que son notificaciones de que ciertas operaciones ocurrirán o han ocurrido.
Hay dos tipos de eventos: ConnectionEvent y RecordsetEvent. Los objetos de conexión generan eventos ConnectionEvent y los objetos Recordset generan eventos RecordsetEvent.
Los eventos son manejados por rutinas de manejo de eventos, que se llaman antes de que comience una operación o después de que finalice.
Algunos eventos ocurren en parejas. El formato del nombre del evento llamado antes de iniciar la operación es WillEvent (evento Will), y el formato del nombre del evento llamado después de completar la operación es EventComplete (evento completo). Los eventos no emparejados restantes solo ocurren después de que finaliza la operación. (No existe un patrón fijo para sus nombres). Los controladores de eventos están controlados por parámetros de estado. Los parámetros de error y de objeto proporcionan información adicional.
Puedes solicitar que el controlador de eventos no acepte ninguna notificación después de la primera notificación. Por ejemplo, puede optar por recibir solo eventos Will o eventos Complete.
El siguiente código muestra un ejemplo del uso de ADO.
Primero agregue la referencia de la biblioteca Microsoft ActiveX Data Object 2.0.
Atenuar db como conexión
Establecer db = Nueva conexión
db.CursorLocation = adUseClient
db.Open "PROVIDER=MSDASQL; DSN=TestDatabase", "sa", "", -1
Atenuar i mientras
Atenuar id mientras
Valor atenuar como único
Atenuar primero como nuevo conjunto de registros
Establecer primer = nuevo conjunto de registros
rst.Abrir "seleccionar * de la tabla de historial de cambios analógicos", db, adOpenDynamic, adLockOptimistic
rst.MoveFirst
Para i = 0 Para rst.RecordCount - 1
id = rst.Fields("ID")
valor= primero .Fields(“VALOR”)
rst.MoveNext
Siguiente i
rst.Close
Establecer primero = Nada
p>
db.Close
6.4 Resumen
La tecnología ADO es una nueva tecnología para acceder a bases de datos. Es fácil de usar, tiene acceso flexible y es fácil de usar. ampliamente utilizado. Las características del uso de ADO para acceder a fuentes de datos se pueden resumir de la siguiente manera:
Fácil de usar
Esta es la característica más importante de la tecnología ADO. Dado que ADO es una aplicación de alto nivel, tiene características orientadas a objetos en comparación con OLE DB u ODBC. Al mismo tiempo, en la estructura de objetos de ADO, la relación jerárquica entre sus objetos no es obvia. En comparación con tecnologías de acceso como DAO, no hay necesidad de preocuparse por el orden de construcción y la jerarquía de construcción de los objetos. Para los objetos a utilizar no es necesario elegir establecer conexiones, sesiones y otros objetos, solo es necesario construirlos directamente, lo que facilita la preparación de los programas de aplicación.
Acceso de alta velocidad a fuentes de datos
Dado que la tecnología ADO se basa en OLE DB, también hereda el acceso de alta velocidad a la base de datos de OLE DB.
Puede acceder a diferentes fuentes de datos
La tecnología ADO puede acceder a todos los sistemas de archivos, incluidas bases de datos relacionales y no relacionales. Esta característica le da a la aplicación mucha flexibilidad y versatilidad.
Se puede utilizar para páginas Microsoft ActiveX
La tecnología ADO puede aparecer en forma de controles ActiveX, por lo que se puede utilizar para páginas Microsoft ActiveX. Esta característica puede simplificar la programación de WEB. páginas.
El programa ocupa menos memoria
Debido a que ADO es una tecnología de acceso basada en el Modelo de objetos componentes (COM), las aplicaciones generadas con ADO ocupan menos memoria.
7. Resumen
No es fácil determinar qué tecnología se debe utilizar al acceder a los datos. Es posible que se requieran utilidades comunes para manejar múltiples tipos de bases de datos; algunos de los datos pueden existir en el disco duro local, algunos en la red y otros en la computadora host. Incluso los productos que los clientes instalan en sus equipos pueden dificultar esta elección. Por ejemplo, el nivel de compatibilidad con ODBC que espera puede depender de la versión de Microsoft Office que tenga instalada, ya que este producto no proporciona compatibilidad con ODBC. También encontrará que las clases ADO proporcionan más objetos y métodos que las clases ODBC. ADO puede proporcionar algunas funciones que son absolutamente necesarias en el programa. Por ejemplo, encontrará que tanto OLE-DB como ADO admiten DFX_Currency, pero no existe una función correspondiente en ODBC, pero debe hacer un cierto esfuerzo para dominarlas. .
Existen varias reglas generales a la hora de elegir OLE-DB u ODBC. Debido a que ADO es en realidad sólo un contenedor para OLE-DB, estas reglas también se aplican a él. A continuación se proporcionan algunos principios básicos que pueden utilizarse para ayudarle a decidir si elige OLE-DB u ODBC.
Entorno no OLE Si desea acceder a una base de datos que admite ODBC y la base de datos está en un servidor que no admite OLE, entonces ODBC es la mejor opción.
Entorno no SQL ODBC es excelente para manejar SQL. Cuando se trata de bases de datos que no son SQL, OLE-DB tiene ventajas muy obvias.
Entorno OLE Para servidores que soportan OLE, la elección entre OLE-DB y ODBC puede estar dividida. Si hay un controlador ODBC disponible, es una buena idea utilizar ODBC; de lo contrario, la única opción es OLE-DB.
Interoperabilidad requerida Si se requieren componentes de base de datos interoperables, entonces la única opción es OLE-DB.