¿Cómo acceder a la base de datos con ADO en C?
1. Descripción general de ADO
ADO está diseñado por Microsoft para el paradigma de acceso a datos OLE DB más reciente y potente. Es una interfaz de capa de aplicación fácil de usar. ADO le permite escribir aplicaciones para acceder y manipular datos en un servidor de base de datos a través del proveedor OLE.DB. Las principales ventajas de ADO son la facilidad de uso, la alta velocidad, el bajo consumo de memoria y el tamaño reducido del disco. ADO utiliza un tráfico de red mínimo en escenarios de aplicaciones críticas y utiliza una cantidad mínima de capas entre el front-end y la fuente de datos, todo para proporcionar una interfaz liviana y de alto rendimiento. La razón por la que se llama ADO es que utiliza una metáfora familiar: la interfaz de automatización OLE.
OLE DB es un conjunto de interfaces de "Modelo de objetos componentes" (COM). Es una nueva interfaz de base de datos de bajo nivel. Encapsula las funciones de ODBC y accede a los datos almacenados en diferentes fuentes de información de forma unificada. manera. . OLE DB es la base técnica de la estrategia UDA (Universal Data Access) de Microsoft. OLE DB proporciona acceso de alto rendimiento a cualquier fuente de datos, incluidas bases de datos relacionales y no relacionales, sistemas de archivos y correo electrónico, textos y gráficos, objetos comerciales personalizados y más. Es decir, OLE DB no se limita a ISAM, Jet o incluso fuentes de datos relacionales, es capaz de manejar cualquier tipo de datos independientemente de su formato y método de almacenamiento. En términos prácticos, esta versatilidad significa poder acceder a datos que residen en hojas de cálculo de Excel, archivos de texto, servicios de directorio/correo electrónico e incluso servidores de correo como Microsoft Exchange. Sin embargo, el propósito de la interfaz de programación de aplicaciones OLE DB es proporcionar una funcionalidad óptima para una variedad de aplicaciones y no cumple con los requisitos de simplicidad. La API que necesita debe ser un puente entre su aplicación y OLE DB, y esta es ActiveX Data Objects (ADO).
2. Utilice ADO en VC (los pasos de desarrollo son los siguientes:)
1 Introduzca el archivo de biblioteca ADO
Antes de usar ADO, debe agregarlo. al stdafx.h del proyecto. Utilice el símbolo de importación directa #import para introducir el archivo de la biblioteca ADO en el archivo de encabezado para que el compilador pueda compilarlo correctamente. El código es el siguiente:
Utilice #import para introducir el archivo de biblioteca ADO
#import "c:\program files\common files\system\ado\msado15.dll"no_namespaces rename(" EOF" adoEOF")
Esta línea de declaración declara que ADO se usa en el proyecto, pero no se usa el espacio de nombres ADO. Para evitar conflictos constantes, la constante EOF pasa a llamarse adoEOF. Ahora no es necesario agregar otro archivo de encabezado, puede usar la interfaz ADO
2. Inicialice el entorno de la biblioteca OLE/COM
Cabe señalar que la biblioteca ADO. es un conjunto de bibliotecas dinámicas COM, lo que significa que la aplicación Antes de llamar a ADO, se debe inicializar el entorno de la biblioteca OLE/COM. En una aplicación MFC, un mejor método es inicializar el entorno de la biblioteca OLE/COM en la función miembro InitInstance de. la clase principal de la aplicación.
BOOL CMyAdoTestApp::InitInstance()
{
if(!AfxOleInit())//Esta es la biblioteca COM de inicialización
{
AfxMessageBox("¡Error de inicialización de OLE!");
return FALSE
}
......
}
3. Introducción a la interfaz ADO
La biblioteca ADO contiene tres interfaces básicas: interfaz _ConnectionPtr, interfaz _CommandPtr y _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. Usar la interfaz _ConnectionPtr para devolver un conjunto de registros no es una buena idea. Las operaciones que devuelven registros generalmente se implementan usando _RecordserPtr. Cuando usa _ConnectionPtr, si desea obtener la cantidad de registros, debe recorrer todos los registros, pero no necesita usar _RecordserPtr.
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 _RecordsetPtr para ejecutar procedimientos almacenados y declaraciones SQL.
4. Utilice la interfaz _ConnectionPtr
_ConnectionPtr es principalmente una interfaz de conexión para obtener una conexión con la base de datos. Su cadena de conexión puede escribirse directamente por sí misma o puede apuntar a un DSN ODBC.
_ConnectionPtr pConn;
if (FAILED(pConn.CreateInstance("ADODB.Connection")))
{
AfxMessageBox( "¡Error al crear instancia!");
return;
}
CString strSRC;
strSRC="Driver=SQL Server; Servidor=";
strSRC="suppersoft";
strSRC="Database=";
strSRC="mydb";
strSRC=";UID=SA;PWD=";
CString strSQL = "Insertar en valores de estudiante(no,nombre,sexo,dirección)(3,'aaa','masculino',' beijing ')";
_variant_t varSRC(strSRC);
_variant_t varSQL(strSQL);
_bstr_t bstrSRC(strSRC);
if (FAILED(pConn-gt;Open(bstrSRC,"","",-1)))
{
AfxMessageBox("¡No se puede abrir la base de datos!"); /p>
pConn.Release();
return;
}
COleVariant vtOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);
p>
pConn-gt;Execute(_bstr_t(strSQL),&vtOptional,-1);
pConn.Release();
AfxMessageBox("ok !" );
5. Utilice la interfaz _RecordsetPtr (tomando como ejemplo la conexión a SQL Server)
_RecordsetPtr pPtr;
if (FAILED(pPtr. CreateInstance("ADODB .Recordset")))
{
AfxMessageBox("¡Error al crear instancia!");
devuelve FALSO;
}
CString strSRC;
strSRC="Driver=SQL Server; Servidor=";
strSRC="210.46.141.145";
strSRC="Base de datos=";
strSRC="mydb"
strSRC="UID=sa;PWD=";
strSRC= " sa";
CString strSQL = "seleccione ID, nombre, género, dirección personal";
_variant_t varSRC(strSRC);
_variant_t varSQL( s
trSQL);
if(FAILED(pPtr-gt;Open(varSQL, varSRC, adOpenStatic, adLockOptimistic, adCmdText)))
{
AfxMessageBox(" ¡Error al abrir la tabla!");
pPtr.Release();
return FALSE;
}
while(!pPtr- gt;GetadoEOF())
{
_variant_t varNo;
_variant_t varName;
_variant_t varSexo;
_variant_t varAddress;
varNo = pPtr-gt;GetCollect ("id");
varName = pPtr-gt;GetCollect ("nombre");
varSex = pPtr-gt; GetCollect ("género");
varAddress = pPtr-gt;
CString strNo = (char *)_bstr_t( varNo);
CString strName =(char *)_bstr_t(varName);
CString strSex =(char *)_bstr_t(varSex);
CString strAddress =(char *)_bstr_t(varAddress);
strNo.TrimRight();
strName.TrimRight();
strSex.TrimRight();
strAddress.TrimRight();
int nCount = m_list.GetItemCount();
int nItem = m_list.InsertItem (nCount, _T("")) ;
m_list.SetItemText (nItem, 0, strNo);
m_list.SetItemText (nItem, 1, strName
m_list.SetItemText (nItem, 2, strSexo);
m_list.SetItemText (nItem, 3, strAddress
pPtr-gt();
pPtr-gt;Close();
pPtr.Release();
6. Utilice la interfaz _CommandPtr
La interfaz _CommandPtr devuelve un conjunto de registros. object y proporciona más funciones de control de conjuntos de registros. El siguiente código ilustra el método de uso de la interfaz _CommandPtr:
Código: use la interfaz _CommandPtr para obtener datos
_CommandPtr pCommand; p>
p>
_RecordsetPtr pRs;
pCommand.CreateInstance(__u
uidof(Command));
pCommand-gt; ActiveConnection=pConn;
pCommand-gt;seleccione * del estudiante";
pCommand- gt;CommandType=adCmdText;
pCommand-gt;Parameters-gt;Refresh();
pRs=pCommand-gt;Ejecutar(NULL, NULL, adCmdUnknown);
_variant_t varValue = pRs-gt; GetCollect("name");
Cstring strValue=(char*)_bstr_t(varValue);
7. Dado que los objetos COM son multiplataforma y utilizan un método común para manejar varios tipos de datos, la clase Cstring y los objetos COM son incompatibles. Necesitamos un 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.
Para más detalles, consulta /lninglove/blog/item/3f6cec22959e4ca34723e833.html