Red de conocimientos sobre prescripción popular - Colección de remedios caseros - ¡Sobre el problema de conectarse a la base de datos a través de ADO en vc 6.0! !

¡Sobre el problema de conectarse a la base de datos a través de ADO en vc 6.0! !

Ejecute un comando SQL y obtenga el conjunto de registros resultante.

Para obtener el conjunto de registros resultante, definimos un puntero al objeto del conjunto de registros: _ RecordsetPtr m _ pRecordset

y creamos una instancia del objeto Recordset para él: m _ p conjunto de registros. createinstance ("adodb.RecordSet");

La ejecución de comandos SQL puede tomar muchas formas, que explicaremos 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:

_recordsetptrconnection 15::execute(_bstr_tCommandText, variante * registros afectados, opción larga) donde CommandText es la cadena de comando, generalmente es un Comando SQL. El parámetro RecordsAffected es el número de filas afectadas después de que se completa 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.

AdCmdTable: Indica que CommandText es un nombre de tabla.

AdCmdProc: Indica que CommandText es un procedimiento almacenado.

AdCmdUnknown: Desconocido

Devuelve un puntero al conjunto de registros después de la ejecución. A continuación damos el código específico y lo explicamos.

Los registros _variant_t se ven afectados;

///Ejecute el comando SQL: CREATE TABLE para crear una tabla de usuario, que contiene cuatro campos: ID de plástico, nombre de usuario de cadena, antigüedad de plástico, fecha. y cumpleaños.

m_connect-gt;execute("CREATE TABLE usuarios(ID INTEGER, nombre de usuario TEXTO, INTEGER antiguo, cumpleaños DATETIME)"), ampRecordsAffected, ADC mdtext);

// /Agregar registros a la tabla.

m_connect-gt;Execute("INSERT INTO usuarios(ID,nombre de usuario,antiguo,cumpleaños) valores(1,"Washington",25,"1970/1/1")", ampRecordsAffected, ADC mdtext );

///Agregue 1 al valor del campo anterior de todos los registros.

m_Connection-gt; ejecutar(" ACTUALIZAR usuarios SET antiguo = antiguo 1 ", ampRecordsAffected, ADC mdtext);

/// Ejecute el comando de estadísticas SQL para obtener el número de registros. conjunto de registros.

m_pRecordset = m_connect-gt;execute(" SELECCIONAR CONTADOR(*)DE usuarios", ampRecordsAffected, ADC mdtext);

_variant_t vin dex =( long)0;

_ variante _ t vCount = m _ pRecordset- gt; get Collect(vin dex); /// Obtiene el valor del primer campo y lo coloca en la variable vCount.

m_pRecordset- gt; close(); ///Cerrar el conjunto de registros

CString message;

Mensaje. Formato ("***Hay d registros", vcount . lval);

AfxMessageBox(message); /// Muestra el número actual de registros.

(2) Utilice el objeto comando para ejecutar comandos SQL

_ CommandPtr m _ pCommand

m_pCommand. CreateInstance("ADODB.Command");

_ variante _ t vNULL

vNULL.vt = VT _ ERROR

v scode = DISP _ E. _ parámetro no encontrado; /// está definido como sin parámetros.

m_command-gt; conexión activa = conexión m_p; /// Una frase clave a la que se asigna la conexión establecida.

m_command-gt;CommandText = "SELECCIONAR * DE usuarios"; /// Cadena de comando

m_pRecordset = m_p command-gt;Ejecutar(ampv null amp; vNULL, ADC mdtext) ; /// Ejecute 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 al procedimiento almacenado. Entraremos en detalles la próxima vez.

(3) Consulta directamente el objeto del conjunto de registros para obtener el conjunto de registros.

Por ejemplo

m_pRecordset-gt;Open("SELECT * FROM usuarios",_variant_t((IDispatch *)m_p conexión,true),adOpenStatic,adLockOptimistic, ADC mdtext);

El prototipo del método abierto es el siguiente:

Conjunto de registros HRESULT 15::Open(const_variant_tamp; fuente, constante_variable_tampActiveConnection, enum CursorTypeEnum CursorType, tipo de bloqueo de enumeración, tipo de bloqueo de enumeración, opción larga )

Incluyendo:

①La fuente es una cadena de consulta de datos.

②ActiveConnection es una conexión establecida (necesitamos construir un objeto _variant_t con un puntero de objeto de conexión).

③CursorType tipo de cursor, que puede ser uno de los siguientes valores.

Mire esta estructura de enumeración:

Enumeración CursorTypeEnum

{

AdOpenUnspecified = -1, /// Sin especificar.

Adopenforwardly = 0, ///Desplaza el cursor estático hacia adelante. Este cursor solo puede explorar el registro establecido hacia adelante. Por ejemplo, usar MoveNext para desplazarse hacia adelante puede aumentar la velocidad de navegación. Pero no se pueden utilizar marcadores, recuento de registros, posición absoluta y página absoluta.

Adopenkeyset = 1, // El registro establecido con este cursor no puede ver las operaciones de adición y eliminación de otros usuarios, pero puede ver la operación de actualización del registro original.

AdOpenDynamic = 2, ///Cursor dinámico. Todas las operaciones de la base de datos se reflejarán inmediatamente en cada conjunto de registros de usuario.

AdOpenStatic = 3 ///Cursor estático. Realiza una copia de seguridad estática de 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.

};

④Tipo de bloqueo LockType, que puede ser uno de los siguientes valores. Consulte la siguiente estructura de enumeración:

Enum Lock Type Enum

{

AdLockUnspecified = -1, /// Sin especificar.

AdLockReadOnly = 1, ///conjunto de registros de solo lectura

adlock pesimistic = 2, modo de bloqueo pesimista. Cuando se actualizan los datos, todas las demás operaciones se bloquean, que es el mecanismo de bloqueo más seguro.

Adlockoptimal = 3, modo de bloqueo optimista. El registro solo se bloquea cuando se llama al método Update. Hasta entonces, aún podrás actualizar, insertar y eliminar datos.

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 la opción ⑤, consulte la introducción del método Ejecutar del objeto Conexión en este artículo.

Recorrido y actualización de 5 conjuntos de registros

Según la tabla de usuarios que acabamos de crear ejecutando comandos SQL, contiene cuatro campos: ID, nombre de usuario, edad y fecha de nacimiento.

Implemente el siguiente código: abra el conjunto de registros, repita todos los registros, elimine el primer registro, agregue tres registros, mueva el cursor al segundo registro, cambie su 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-gt;Open("SELECT * FROM usuarios",_variant_t((IDispatch *)m_p conexión,true),adOpenStatic, adLockOptimistic, ADC mdtext);

Y (!m_pRecordset-gt;AdoEOF)//¿Por qué está aquí AdoEOF en lugar de EOF? ¿Aún recuerdas la frase rename("EOF", "adoEOF")?

{

vID = m _ pRecordset- gt; get Collect(_ variante _ t((long)0) ///Obtiene el valor de la columna 1, comenzando desde 0 cuenta.

También puede dar directamente el nombre de la columna como se muestra en la siguiente línea.

vUsername = m_pRecordset-gt; GetCollect("Username"); ///Obtiene el valor del campo de nombre de usuario.

vOld = m_pRecordset-gt;get Collect("old");

vBirthday = m_pRecordset-gt;GetCollect("cumpleaños");

// /La ventana de salida en modo de depuración genera los registros en el conjunto de registros.

if(vID.vt! Valor NULL. ampvUsername.vt! Valor NULL. ampvOld.vt! Valor NULL. ampvBirthday.vt!= VT_NULL)

TRACE("id: d , Nombre: s, Edad: d, Cumpleaños: s \ r \ n ", vid. lval, (lpctstr) (_ bstr _ t) vusername, vold. lval, (lpctstr) (_ bstr _ t) vbir.

m _ pRecordset- gt; MoveNext(); /// Pasar al siguiente registro

}

m _ pRecordset- gt; /Mover al primer registro

m_pRecordset-gt;delete(adAffectCurrent);///Eliminar el registro actual

///Agregar tres nuevos registros y asignar valores p><. p>for(int I = 0; i lt3; i)

{

m_pRecordset- gt; add new() ///Agregar nuevo registro

m_pRecordset-gt;PutCollect("ID",_variant_t((long)(I 10)));

m_pRecordset-gt;Putcollect("Nombre de usuario", _ variante _ t("Yelchin")

m _ pRecordset- gt; PutCollect("antiguo ", _ variante _ t((long)71));

m_pRecordset-gt;PutCollect("Cumpleaños", _variant_t("1930-3-15"));

}

m_pRecordset-gt; Move(1, _ variante _ t((long)adBookmarkFirst)); Bajar un registro desde el primer registro, es decir, pasar al segundo registro

m _ pRecordset-gt ;PutCollect(_variant_t("old "), _variant_t((long)45)); //Modificar su antigüedad

m_pRecordset-gt;update(); ///Guardar Ir a la biblioteca

6 Cerrar el conjunto de registros y la conexión

Puede utilizar el método de cierre para cerrar el conjunto de registros o la conexión.

m _ pRecordset- gt; close(); ///Cerrar el conjunto de registros

m _Connection- gt; ///Cerrar la conexión

En este punto, creo que ya está familiarizado con el proceso general de operación de la base de datos ADO. Tal vez tengas un plan bien pensado o tal vez estés un poco confundido.

¡No importa! Se recomienda que intente escribir algunos ejemplos que le permitirán familiarizarse mejor con ADO.

-

Publica un artículo para ti.

Proceso básico

Todo es difícil al principio. Para los principiantes en cualquier tecnología nueva, lo más importante es "empezar" y dominar sus aspectos esenciales. ¡Primero echemos un vistazo al proceso básico del desarrollo de bases de datos ADO!

(1) Inicialice la biblioteca COM e introduzca el archivo de definición de la biblioteca ADO.

(2) Utilice el objeto de 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.

Preparación:

Para que todos puedan probar los ejemplos proporcionados en este artículo, estamos utilizando la base de datos de Access. También puede encontrar este test.mdb directamente en el código de muestra que tenemos. proporcionar.

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, lo que generalmente se realiza en la función sobrecargada de CWinApp::InitInstance(). Mire el siguiente código:

BOOL cado test 1 app::initstance()

{

AfxOleInit();

......

2 Utilice la directiva #import para introducir la biblioteca de tipos ADO

Agregamos la siguiente oración a stdafx.h: (¿Dónde puedo encontrar este archivo? ? Puede encontrarlo en el archivo de encabezado de la vista de archivos)

# import "c:\program files\common files\system\ado\msado 15.dll" no_namespace rename("EOF", "adoEOF ")

¿Qué hace esta oración? Su función final es similar al familiar #include. Al compilar, el sistema generará dos archivos de encabezado C, MSADO15. TLH y ADO15. TLI, para definir la biblioteca ADO.

Algunas notas:

(1) Es posible que msado15.dll en su entorno no esté en este directorio; modifíquelo de acuerdo con la situación real.

(2) Al compilar, puede aparecer la siguiente advertencia. Microsoft explica esto en MSDN y recomienda ignorarla.

msado15.tlh(405): advertencia C4146: operador menos unario aplicado al tipo sin firmar, el resultado permanece sin firmar

3 Cree un objeto de conexión y conéctese a la base de datos.

Primero, necesitamos agregar un puntero al objeto de conexión:

_ ConnectionPtr m _ pConnection

El siguiente código demuestra cómo crear una instancia de objeto de conexión. y cómo conectarse a la base de datos y detectar la excepción.

BOOL cado prueba 1 DLG::OnInitDialog()

{

CDialog::OnInitDialog();

HRESULT hr

HRESULT hr

p>

Pruebe

{

hr = m_connect. CreateInstance("ADODB.Connection"); ///Crear objeto de conexión

if (éxito(hora))

{

hr = m_connection- gt; Abierto("Proveedor=Microsoft.

Jet. OLEDB.4.0 data source = test.mdb ", "", "", admode desconocido); ///Conéctate a la base de datos

///El proveedor en la cadena de conexión en la oración anterior. es Para el entorno ACCESS2000, debe cambiar: proveedor = Microsoft jet 3.51; _ errore)//Excepción de captura.

{

CString mensaje de error

Mensaje de error("¡Error al conectarse a la base de datos!\r\Mensaje de error. : s", e. mensaje de error());

AfxMessageBox(mensaje de error); ///Mostrar mensaje de error

}

En este código, pasamos El método Open del objeto Connection se conecta a la base de datos

Conexión HRESULT 15::Open(_bstr_t ConnectionString, _bstr_t Contraseña, opción larga)

ConnectionString es la cadena de conexión. UserID es el nombre de usuario, Contraseña es la contraseña de inicio de sesión y Opciones son opciones de conexión, que se utilizan para especificar los permisos para que el objeto de conexión actualice los datos.

Las opciones pueden ser las siguientes constantes:

AdModeUnknown: no se han establecido permisos actuales

AdModeRead: solo lectura

AdModeReadWrite: lectura-escritura

p>

AdModeShareDenyRead. : Impide que otros objetos de conexión abran conexiones con permisos de lectura

AdModeShareDenyWrite: Impide que otros objetos de conexión abran conexiones con permisos de escritura

AdModeShareExclusive: Impide que otros objetos de conexión abran conexiones con permisos de lectura. Abra una conexión con permisos de lectura y escritura

AdModeShareDenyNone: evite que otros objetos de conexión abran conexiones con cualquier permiso

Le brindamos algunos métodos de conexión comunes para su referencia:

(1) Conéctese a la base de datos ACCESS2000 a través del motor de base de datos JET

m_Connect->Open("Provider=Microsoft. Jet. OLEDB.4.0 fuente de datos = C:\\test.mdb ", "", "", admode desconocido);

(2) Conecte cualquier base de datos habilitada para ODBC a través de la fuente de datos DSN: p>

m_connection->open("Fuente de datos = adotest; UID = saPWD =;","","",admode desconocido);

(3) En el caso de no Caso DSN conectarse a la base de datos SQL SERVER:

m_connect->open(" driver = { SQL Server }; server = 127. 0. 0. 1; DATABASE = vckbaseUID = saPWD = 139 ", "", "", admode desconocido);

Entre ellos, Servidor es el nombre del servidor SQL y BASE DE DATOS es el nombre de la biblioteca.

Además del método Open, existen muchos métodos en el objeto Connection. Primero introduzcamos dos propiedades útiles en el objeto de conexión, ConnectionTimeOut y State.

ConnectionTimeOut se utiliza para establecer el tiempo de espera de la conexión y debe llamarse antes de abrirse, por ejemplo:

m_connection-gt; tiempo de espera a 5 segundos.

m_Connection-gt;open("Fuente de datos = adotest;","","",admode desconocido);

El atributo Estado representa el estado del objeto de conexión actual, 0 significa cerrado, 1 significa abierto. Podemos leer este atributo para realizar el procesamiento correspondiente, por ejemplo:

if(m_pconnection-gt;status)

m_connection-gt;close() ///Si la conexión es ya abierto, ciérrelo.

-

Oh, por cierto, nunca antes había sido VC, así que esta vez mi jefe tiene un proyecto que hacer y ¡no hay nada que pueda hacer! ! ¡Pregunte más en el futuro! !

-

Ahora no comprendes muchos conceptos básicos e incluso la base de datos es un poco difícil.

-

Si usa vc6, haga clic derecho en el control donde desea agregar variables, seleccione la pestaña del asistente de clases y de variables miembro, y automáticamente apuntará al control donde desea agregar variables. desea agregar variables. Simplemente haga clic en Agregar variable y asígnele un nombre.

-

¡Mi punto principal es que no sé cómo agregar las variables correspondientes al control! ! ¡Por favor déjalo claro! !

-

¿Qué es CBaseEditBox? No lo definas de esta manera. Primero debe colocar el control en el formulario de diálogo y luego agregar la variable correspondiente al control, de modo que VC asocie automáticamente el control con la variable.

-

Lo acabo de recibir, no es muy bueno, ¡explícalo claramente! ! !

¡Quiero poner los registros leídos de la base de datos en un cuadro de texto!

Luego coloque un cuadro de edición en la interfaz.

Agregué variables en la clase C***Dlg.

Público:

CBaseEditBox m_list

A continuación, me conecto a la base de datos en el evento onOK del botón y quiero poner los registros obtenidos en m_list.

//Lee los campos de la biblioteca y agrégalos al cuadro de lista.

Y (!m_pRecordset-gt;adoEOF)

{

var = m_pRecordset->GetCollect("nombre de usuario");

if(var.vt!= VT_NULL)

strName =(LPCSTR)_ bstr _ t(var);

var = m_pRecordset->get Collect(" Contraseña " );

if(var.vt!= VT_NULL)

strAge =(LPCSTR)_ bstr_t(var);

m_list. AddString( strName " -> strAge);

m_pRecordset- gt; MoveNext();

}

//La lista predeterminada apunta al primer elemento, También mueve y muestra el puntero de registro

m_list.

SetCurSel(0);

Entonces muchos errores:

d:\Microsoft visual studio\mis proyectos\testado\testadodlg.h(18): error C2146: error de sintaxis: falta ";" antes del identificador 'm_list'

d:\Microsoft visual studio\mis proyectos\testado\testadodlg.h(18): error C2501: 'CBaseEditBox': falta clase de almacenamiento o especificador de tipo

d:\Microsoft visual studio\mis proyectos\testado\testadodlg.h(18): error C2501: 'm_list': falta clase de almacenamiento o especificador de tipo

TestADODlg.cpp

d:\Microsoft visual studio\mis proyectos\testado\testadodlg.h(18): error C2146: error de sintaxis: falta ';' antes del identificador 'm_list'

d:\Microsoft visual studio\mis proyectos\testado\testadodlg.h(18): error C2501: 'CBaseEditBox': falta clase de almacenamiento o especificador de tipo

d:\Microsoft visual studio\mis proyectos\ testado\testadodlg.h( 18): error C2501: 'm_list': falta clase de almacenamiento o especificador de tipo

d:\Microsoft Visual Studio\mis proyectos\TestADO\testadodlg.CPP(195): error c2065: 'm_list': no ​​declarado identificador

d:\Microsoft Visual Studio\mis proyectos\TestADO\testadodlg(195): error C2228: en. AddString" debe tener una clase/estructura/tipo de unión

d:\Microsoft Visual Studio\mis proyectos\TestADO\testadodlg. CPP(201): Error C2228: El lado izquierdo de SetCurSel" debe tener una clase/ struct /UnionType

Generar código...

Se produjo un error al ejecutar cl.exe.

¿Cuál es el motivo?

-

/document/viewdoc/? id=496

Reemplace la declaración de acceso a la conexión en el artículo con:

Conéctese a la base de datos SQL:

m_connection-gt;open(" Proveedor = SQL oledb .servidor = 192.168.1.6; base de datos = mysqlUID = saPWD =; ", "", "", admode desconocido);

Entre ellos, Servidor es el nombre del servidor SQL y BASE DE DATOS. es el nombre de la biblioteca.

-