Descripción general de la tecnología de programación 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 desconocidom_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); p>
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, p>
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