Colección de citas famosas - Slogan de motivación - Descripción general de la tecnología de programación ADO

Descripción general de la tecnología de programación ADO

1) Introduzca el archivo de definición de la biblioteca ADO.

# import " c:/archivos de programa/archivos comunes/system/ado/msado 15.dll " no_namespace

rename("EOF", "adoEOF")

Al compilar, se generarán dos archivos de encabezado para nuestros archivos de proyecto:

Msado15.tlh y ado15.tli

Tenga en cuenta que la ruta de msado15.dll puede ser diferente. Por favor verifique la ruta en su computadora.

2) Inicializar la biblioteca COM

Agregar la función InitInstance() de la clase App del proyecto.

AfxOleInit(); //Uso de MFC

El método tradicional de C es -

:: Inicialización común (NULL);

….

* país inicializar();

3) Pasos básicos para obtener un conjunto de registros utilizando un objeto de conjunto de registros.

//Generar un objeto de conexión y vincularlo a la base de datos.

_ ConnectionPtr m _ pConnection

HRESULT hr

Prueba

{

hr = m_Connection. crear instancia(_ _ uuidof(Conexión));

if (éxito(hora))

{

m _Connection-gt; Microsoft.Jet.OLEDB.4.0

Fuente de datos = primario.mdb","","",admode desconocido);

}

}< / p>

catch(_com_error e)

{

CString mensaje de error

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

AfxMessageBox(mensaje de error);

}< /p >

//Generar un objeto de conjunto de registros y obtener un conjunto de registros.

_ RecordsetPtr m _ pRecordset

m_pRecordset. CreateInstance("ADODB. Recordset");

CString temp = " SELECT * FROM " tablename; // Supongamos que tablename es un nombre de tabla de tipo CString.

_variante_t sql

sql. SetString(temp);

m_pRecordset-gt; open(sql,

m_connection.

GetInterfacePtr(),

adOpenDynamic, adLockOptimistic, ADC mdtext);

4) Consulta dinámica

Nombre de la tabla CString;

Tablename= _T("Identidad del estudiante");

CString temp = _ T(" SELECT * FROM ") nombre de tabla _ T(" WHERE NAME = ' "

DLG . m _ nombre _ T("");

_variant_t sql

sql.SetString(temp);

m_pRecordset-gt; SQL, m_pConnection.GetInterfacePtr() ,

adOpenDynamic, adLockOptimistic, ADC mdtext);

5) Recorre el conjunto de registros

int line = 0;

while( !m_pRecordset-gt;AdoEOF) //Recorre el conjunto de registros y muestra todos los registros en una vista de lista.

{

. . . . . .

line;

m _ pRecordset- gt; MoveNext();

}

El resto de la operación es simple. Puede consultar otros artículos y, lo más importante, no olvide cerrar el conjunto de registros, ya que esto a menudo provocará excepciones.

6) Utilice ADO para conectarse a diferentes bases de datos:

Según los diferentes proveedores de datos, se puede dividir en varios métodos, como ODBC y OLEDB. ODBC es más compatible y hay relativamente pocas bases de datos que admitan OLEDB.

Conéctese a la base de datos de SQL Server:

1) Interfaz de acceso Microsoft OLE DB para ODBC

m_Connect->open(" Proveedor = SQL oledb.1;DRIVER =SQLServerSERVER=lzhmDATABASE=海棠","sa","sa",admode desconocido);

2) Método desconocido, pero factible. Tenga en cuenta que los directorios iniciales están separados por espacios.

m_connection-gt; open("Proveedor = SQL oledb. 1; fuente de datos = directorio inicial lzhm = Begonia", "sa", "sa", admode desconocido

); m_Connection-gt; open("Proveedor = SQL oledb; fuente de datos = 172. 20. 2. 97; biblioteca de red = directorio inicial DBMSSOCN = Begonia", "sa", "sa", modo de acceso desconocido

<); p>m_Connection-gt; open("Proveedor = SQL oledb; Dirección de red = 172. 20. 2. 97; Directorio inicial = Begonia", "sa", "sa", admode desconocido

m_Connection-gt;open("Proveedor = SQL oledb; Dirección de red = 172. 20. 2. 97; Biblioteca de red = DBMSSOCN directorio inicial = Begonia", "sa", "sa", admode desconocido);

3)Proveedor Microsoft OLE DB para SQL Server

m_connection-gt; open(" Proveedor = SQL oledb. 1; fuente de datos = directorio inicial lzhm = Haitang ", "sa", "sa", admode desconocido);

4) No utilice la conexión DSN.

m_connect-gt; open(" driver = { SQL Server }; server = lzhmdatabase = Begonia", "sa", "sa", admode desconocido

Cómo conectarse a la base de datos de ACCESS 2000:

m_connect->Open("Provider=Microsoft.Jet.OLEDB.4.0DataSource=Primary.mdb","","",admode desconocido);

Cómo conectarse a una base de datos de ACCESS 97:

m_connect->Open("Provider=Microsoft.jet.oledb.3.51;DataSource=Primary.mdb","", "", admode desconocido);

7) Una función común, pasa una instrucción SQL y luego abre un conjunto de registros, suponiendo que el objeto del conjunto de registros m_pRecordset existe:

BOOL CHaiTangView::get recordset(CString SQL)

{//Si el conjunto de registros generado no está vacío, devuelve VERDADERO.

if(m_pRecordset- gt; GetState()==1)//Si el objeto del conjunto de registros ya está abierto, ciérrelo primero.

m _ pRecordset- gt; close();

HRESULT hr

_ variante _ t v _ sql

v_sql. SetString(SQL);

Pruebe

{

HR = m_pRecordset-gt; Open(v_sql, m_pConnection.

GetInterfacePtr(), adOpenDynamic, adLockOptimistic, ADC mdtext);

if (éxito(hora))

{

}

}

catch(_com_error e)

{

CString mensaje de error

Mensaje de error. Format("¡Error al consultar la tabla de datos!/r/nMensaje de error: s ", e. mensaje de error());

AfxMessageBox(mensaje de error);

Devuelve 0;

}

m_pRecordset-gt; MoveFirst();

If (!m_pRecordset-gt;AdoEOF) // Con SUCCEEDED(hr), no hay forma de saber si el conjunto de registros generado está vacío.

{//Por lo tanto, es necesario determinar si el número máximo de registros en el conjunto de registros generado es 0.

Se debe devolver TRUE//SUCCEEDED(hr) para identificar excepciones. Los conjuntos de registros vacíos no son una anomalía.

}

Otro

{

MessageBox("Lo sentimos, no se encontraron registros coincidentes, comuníquese con el administrador del sistema" );

Devolver FALSO

}

}

8) Ocurrió un problema al llamar a Recordset::PutCollect:

Seleccione la tabla de atributos de la costa. Número de serie, s1. Nombre, tabla de atributos de la costa. Atributos de costa, tabla de atributos de costa. Número de estación inicial, tabla de atributos de costa. Número de estación de punto final, tabla de atributos de costa. Tabla de elevación superior de la costa y atributos de la costa. Subclase de forma estructural, tabla de atributos de costa. Subclase de forma estructural, tabla de atributos de la costa. La tabla del diccionario de datos es s1, donde s1. ID=tabla de atributos de línea costera. Tabla de nombres de costas ordenados por atributos de costa. Número de serie.

Seleccione * para ordenar por número de serie de la tabla de ecologización del malecón

Seleccione la tabla de atributos de la costa. Número de serie, s1. Nombre, s2. El nombre en la tabla de atributos de la costa, la tabla del diccionario de datos es s1 y la tabla del diccionario de datos es s2, donde s1. ID=tabla de atributos de línea costera. Nombre de la línea de costa y s2. ID=tabla de atributos de línea costera. Las unidades responsables se clasifican según la tabla de atributos de la costa. Número de serie.

Durante el proceso de desarrollo de Seawall, se descubrió que si usa el método RecordSet::Open para llamar a una instrucción SQL para abrir el conjunto de registros y usa la instrucción ORDER BY en la instrucción SQL, entonces usa el método Recordset::PutCollect para escribir datos será incorrecto, al menos usa VC, ADO y SQL Server7.0 o 2000.

9) Llamar a procedimientos almacenados, procedimientos almacenados en ATL.

STDMETHODIMP CFBGET::GetDataByProc(BSTR·bstr nombre del proceso, BSTR·bstr param, BSTR* plPower)

{

// TODO: Añade aquí tu código de implementación

* plPower = NULL

USES _ CONVERSION

////////////////// // /////////////////////////////////////////////////// / ////////

///Establecer una conexión con la base de datos.

_ConexiónPtr m_pCon

m_pCon.

crear instancia(_ uuidof(Conexión));

Matriz de caracteres[200];

GetWindowsDirectory(matriz, 200);

strcat(matriz, "/ /FB_DATA.INI");

char servername[100];

GetPrivateProfileString("ServerName","Name","",ServerName,100,array);

char str_con[1024];

wsprintf(str_con, "Proveedor = SQL oledb . 1; Fuente de datos = s; Directorio inicial = Begonia; ID de usuario = Begonia; PWD = Begonia", nombre del servidor );

m_pCon- gt; Open(str_con, "", "", admode desconocido);

//////////// //// /////////////////////////////////////////////////// /////////////////

///Crear objeto de comando

_ CommandPtr m _ pCommand

m_pCommand . CreateInstance("ADODB.command");

m_command-gt; ActiveConnection = m_pCon

_ variante_t nombre = " proc_user

BSTR bname = SysAllocString(ol estr (" proc _ usuario "));

m _Command-gt; el parámetro para escribir char* y extraer dos parámetros char*

char * p = W2A(bstrParam);

char temp = p;

. char * p 1 = temp;

mientras(*temp!='T ')

{

temp ;

}

* temp = '/0 ';

temp ;

char * p2 = temp

mientras(*temp!='T ')

{

temp ;

}

* temp = '/ 0 ';

/ /Convierte los dos parámetros al tipo BSTR

BSTR bstrp 1 = A2W(p 1);

BSTR bstr p2 = A2W;

/. //Crear objeto de parámetro 1

_ parámetro ptr p _ param 1;

p_Param1.

Parámetro");

p_param 1->; Nombre = " nombre

p_param 1->; Tipo = adVarChar

p_param 1 ->Tamaño = 50

p_param 1->Dirección = adParamInput

p_param 1->valor = bstrp 1

m _Command - gt; Parámetro - gt; );

///Crear objeto de parámetro 2

_ ParameterPtr p _ Param2

p_Param2. CreateInstance("ADODB.Parameter");

p _ param 2- gt; Nombre = " clave

p _ param 2- gt; Tipo = adVarChar

p _ param 2- gt; Tamaño = 50

p _ param 2- gt; Dirección = adParamInput

p _ param 2- gt; p>m _command - gt; parámetro - gt; append(p _ param 2);

///Crear objeto de parámetro 3

_ bstr _ t bstrP3

_ ParameterPtr p _ Param3

p_Param3. CreateInstance("ADODB.Parameter");

p _ param 3- gt; p _ param 3- gt;Tipo = adInteger

p _ param 3- gt; tamaño = 10;

p _ param 3- gt; Dirección = adParamOutput

//p_param 3->Value = bstrP3//Debido a que es un parámetro de salida, nunca se puede especificar un valor.

m _command - gt; parámetro - gt; append(p _ param 3);

/// Ejecuta el procedimiento almacenado y obtiene los parámetros de salida.

m_command-gt;Execute(NULL, NULL,adCmdStoredProc);

_bstr_t valor = p_param 3-gt;GetValue();

const char * ppp = valor

* pl power = SysAllocString(A2W(PPP));

Return S_OK

}

Tenga en cuenta que si solo Si se escribe una instrucción de selección en el procedimiento almacenado, se devolverá un objeto de conjunto de registros después de la ejecución, que puede ser utilizado por ADO.

m _ pRecordet = m _ p comando- gt; ejecutar (...) para aceptar,

Sin embargo, si el procedimiento almacenado contiene múltiples declaraciones de selección, ADO no puede aceptar objetos Recordset. usarse juntos.

10) Utilice objetos de comando para ejecutar sentencias SQL.

_CommandPtr m _pCommand

m_pCommand.

CreateInstance("ADODB.Command");

m_Command-gt; ActiveConnection = m_pCon//m_pCon es el objeto de conexión de la base de datos.

m_command-gt;CommandText = "ACTUALIZAR tabla 1 set num_id = ' 2 ' WHERE valor = ' 44 ' ";

m_command-gt;CommandType = adCmdText

m _Command-gt;Parameter-gt;Refresh();

///Ejecutar el procedimiento almacenado y obtener los parámetros de salida.

m _Command-gt; Execute(NULL, NULL, adCmdUnknown);

11) Obtiene el número de campos en el conjunto de registros.

m_pRecordset-gt;Field-gt;GetCount();

El tipo de campo también se puede obtener de forma similar.

campos ptr campos = m_Rec- gt; obtener campos();

* pcActualColSize = campos- gt;

Variante varIndex

VariantInit(amp;varIndex);

varIndex.vt = VT_I4

campo FieldPtr;

DataTypeEnum adoType

para (longi = 0; ilt* pcActualColSizei)

{

varindex .lval = I;

campo = campos- GetItem (varIndex);

adoType = field- gt; GetType();

}

La siguiente es la tabla de correspondencia de tipos

enumDataTypeEnum

{adEmpty= 0,

adTinyInt= 16,

adSmallInt= 2,

adInteger= 3,

adBigInt= 20 ,

adUnsignedTinyInt= 17,

adUnsignedSmallInt= 18,

adUnsignedInt= 19,

adUnsignedBigInt= 21,

adSingle= 4,

adDouble = 5,

adCurrency= 6,

sumar decimal = 14,

adNumeric= 131 ,

adBoolean= 11,

adError= 10,

adUserDefined= 132,

adVariant= 12,

adIDispatch= 9

adIUnknown= 13,

adGUID= 72,

adDate= 7,

adDBDate = 133,

adDBTime= 134,

adDBTimeStamp= 135,

adBSTR= 8,

adChar= 129,

adVarChar= 200,

adLongVarChar= 201,

adWChar= 130,

adVarWChar= 202,

adLongVarWChar= 203,

adBinary= 128,

adVarBinary= 204,

adLongVarBinary= 205,

adChapter= 136,

adFileTime = 64,

adpropvanant = 138,

adVarNumeric= 139

} DataTypeEnum

typedefenumParameterDirectionEnum

{dbParamInput = 1,

db

ParamOutput = 2,

dbParamInputOutput= 3,

dbParamReturnValue= 4

} ParameterDirectionEnum