Red de conocimiento informático - Conocimiento informático - En SQL incorporado, si el resultado es una colección de registros, ¿qué se utilizará para convertir el SQL?

En SQL incorporado, si el resultado es una colección de registros, ¿qué se utilizará para convertir el SQL?

Utilice ODBC para acceder a la base de datos de SQL Server en VC++

ODBC (Open Database Connectivity, Open Database Connection) es un estándar de acceso a bases de datos definido por Microsoft, que proporciona

Proporciona un método de acceso a bases de datos estándar para acceder a las bases de datos de diferentes proveedores de bases de datos, que es esencialmente un conjunto de API de acceso a bases de datos. Aunque

hay muchos métodos para acceder a bases de datos, ODBC utiliza su programación es relativamente simple y. Se utiliza ampliamente en la programación real.

VC++ proporciona un conjunto de clases ODBC de MFC que encapsulan la API de ODBC para reducir la cantidad de escritura de código de programa. Cuando se utiliza la clase MFC en VC++ para acceder a la base de datos, generalmente primero se configura o selecciona una fuente de datos existente, luego se construye el objeto de clase CDatabase, se abre la fuente de datos y se pueden utilizar los objetos de clase de base de datos y SQL (lenguaje de consulta estructurado). se usa para acceder a la biblioteca, y luego se pueden construir la clase CRecordset o sus objetos de clase heredados.

Los objetos de clase Dataset y SQL se pueden usar para operar las tablas en la biblioteca. Usar la clase MFC ODBC para operar la base de datos de SQL Server en VC++ es básicamente la misma idea.

1. Configurar la fuente de datos

Configurar dinámicamente la fuente de datos según la selección del usuario en el programa sin llamar al administrador de fuentes de datos ODBC es a veces muy necesario para el desarrollo de aplicaciones

. Después de todo, el Administrador de fuentes de datos ODBC es demasiado complicado para los usuarios que no están familiarizados con las bases de datos, y el estilo de la interfaz del Administrador de fuentes de datos ODBC puede ser inconsistente con el estilo de la interfaz de toda la aplicación. Para aplicaciones rigurosas, Para desarrolladores de programas. estos son intolerables.

Al configurar la fuente de datos de SQL Server, debe tener el nombre del servidor SQL Server y el nombre de la base de datos de destino en el servidor (de lo contrario, al abrir la fuente de datos

, la opción Configurar datos El cuadro de diálogo Fuente aparecerá o fallará). Esto es diferente de especificar la ruta del archivo de base de datos al configurar la fuente de datos de una base de datos como Access

.

Puede obtener todos los servidores SQL Server locales, bibliotecas en los servidores, información de idioma, etc.

a través de la función API ODBC SQLBrowseConnect. Su uso es el siguiente:

①Obtener el nombre del servidor

SQLBrowseConnect(hdbc, "DRIVER={SQL Server};", SQL_NTS, BrowseResult, sizeof(BrowseResult),

p>

&BrowseResultLen);

donde hdbc es el identificador de conexión obtenido usando la función SQLAllocHandle, el segundo parámetro es la cadena de entrada que especifica el atributo de conexión y el tercer parámetro

es la longitud de la cadena de entrada. El cuarto parámetro es el puntero de la cadena de salida. La información que queremos obtener se almacena en esta cadena. El quinto parámetro especifica la longitud de la cadena de salida. la cadena de salida. Los seis parámetros son la longitud real de la cadena devuelta. La cadena devuelta por la función apuntada por BrowseResult

contiene una cadena en el formato "SERVIDOR: Servidor={Servidor_nombre1, Servidor_nombre2,...}", donde Servidor_nombre1 y

Server_name2 es el nombre del servidor SQL Server.

②Obtener el nombre de la biblioteca

Después de que el usuario selecciona un servidor, la función SQLBrowseConnect se puede utilizar para obtener la biblioteca o la información del idioma existente en el servidor

(si es necesario palabras).

SQLBrowseConnect(hdbc, "SERVER=Server_name1; UID=sa;PWD=515578;", SQL_NTS, BrowseResult,

sizeof(BrowseResult), &BrowseResultLen

<); p>Donde UID y PWD son el nombre de usuario y contraseña para acceder al servidor. Esta vez la cadena devuelta por la función apuntada por BrowseResult contiene

formas de BASE DE DATOS: Base de datos={maestro, modelo,...} e IDIOMA: Idioma={árabe, brasileño, inglés,

...} cadena, donde maestro y modelo son los nombres de la base de datos en el servidor.

Utilice esta información para configurar la fuente de datos de SQL Server:

SQLConfigDataSource (NULL, ODBC_ADD_DSN, "SQL Server", "DSN=myDSN\0

SERVER =xhm\0DATABASE=pubs\0\0" ))

El autor tuvo la suerte de encontrar la clase CSQLInfoEnumerator escrita por Santosh Rao en Internet. Esta clase incluye EnumerateSQLServers,

EnumerateDatabase y EnumerateDatabaseLanguage. Una función miembro que encapsula la función SQLBrowseConnect y realiza el procesamiento de caracteres correspondiente, lo que simplifica enormemente el uso de la función SQLBrowseConnect.

2. Establezca una conexión con la fuente de datos

Si utiliza funciones API de ODBC para conectarse, se pueden implementar las funciones SQLConnect, SQLDriverConnect y SQLBrowseConnect.

. La función SQLConnect se usa para establecer directamente una conexión con la fuente de datos dados todos los parámetros; SQLDriverConnect se usa para proporcionar algunos parámetros de conexión y abre la ventana de exploración de la fuente de datos para interactuar con el usuario. se establece después de obtener suficientes parámetros. Conexión a la fuente de datos;

SQLBrowseConnect obtiene los parámetros de conexión a través de la iteración y luego se conecta.

MFC proporciona una clase de base de datos CDatabase para conectarse a fuentes de datos, a través de la cual podemos establecer fácilmente una conexión con la fuente de datos:

//m_db es el objeto de CDatabase

//m_szUserId, m_szPassword son objetos CString, que son el nombre de usuario y la contraseña para acceder a la fuente de datos

CString str;

str = _T("DSN=xhmtest; UID=") +m_szUserId+_T(";PWD=")+m_szPassword;

if (! m_db.OpenEx(str, CDatabase::noOdbcDialog ) ){

AfxMessageBox( "Error al abrir la fuente de datos");

}

Además, si queremos operar en la fuente de datos, podemos usar el objeto CDatabase abierto para ejecutar declaraciones SQL.

Por ejemplo, cree una nueva tabla

:

str = "CREAR TABLA TableDemo (Columna1TEXTO, Columna2 NÚMERO)";

m_db.ExecuteSQL(sSql);

p>

3. Obtener la información estructural de la base de datos

En VC++, puede usar solo la API ODBC para obtener la información estructural de la base de datos, pero el método es muy complicado. y los diversos parámetros no son fáciles de entender, y

Los resultados devueltos no son fácilmente accesibles. MFC tampoco proporciona una clase separada para que los desarrolladores de aplicaciones obtengan información sobre la estructura de la base de datos. Pero también podemos

obtener la información estructural de la base de datos fácilmente a través de algunos métodos existentes.

3.1 Obtener las tablas en la base de datos

Utilizando la función SQLTables de la API de ODBC, puede obtener la información de la tabla en la base de datos, pero no es fácil de usar.

Hay una rutina de catálogo en el ejemplo de MSDN, que demuestra cómo obtener información de tablas e información de campos en una base de datos. Hay dos métodos muy prácticos en este programa: Ctables y Ccolumns. CTables hereda la clase CRecordset, encapsula la función SQLTables de una manera muy inteligente y almacena el conjunto de resultados en la clase CRecordset para facilitar el acceso.

En el programa podemos aplicarlo así:

//m_db es el objeto CDatabse abierto,

//m_strTableOwner es el objeto CComboBox

CTables rs(&m_db);

rs.Open(NULL, NULL, NULL, "TABLE");

CString strTableRef;

m_combTable .ResetContent ();

mientras (!rs.IsEOF())

{

strTableRef = _T("[");

if (!rs.m_strTableOwner.IsEmpty())

strTableRef += rs.m_strTableOwner + _T("].[");

strTableRef += rs.m_strTableName + _T( "]");

m_combTable.AddString(strTableRef);

rs.MoveNext();

}

rs .Close ();

Especificar "TABLE" en el cuarto parámetro del método Open del objeto CTables se refiere a devolver la tabla en la biblioteca cuando el parámetro es "SYSTEM TABLE"

<. p>Regresar a las Tablas del sistema, cuando NULL, devuelve todas las tablas.

3.2 Obtener la estructura de campos en la tabla

Hay tres métodos de implementación específicos para obtener la estructura de campos en la tabla:

① Utilice directamente la API ODBC función SQLColumn; su implementación también es igual de compleja.

②Utilice la clase CColumns mencionada anteriormente que encapsula la función SQLColumns; su uso es similar a CTables y su variable miembro

m_strColumnName es el nombre del campo

③Usar las funciones miembro de la clase CRecordset. MFC proporciona un método para obtener información de la estructura de la tabla en la clase CRecordset, que es muy conveniente de usar.

(¿Pero es extraño por qué la clase CDatabase no tiene un método de clase para obtener información de la estructura de la biblioteca?)

Usaremos CRecodrset como ejemplo para explicar brevemente cómo obtener la estructura de la mesa.

Supongamos que ahora queremos obtener todos los nombres de los campos de la tabla seleccionada por el usuario en el objeto CComboBox

y fusionarlos en los nombres de las columnas de un objeto CListCtrl (cuya propiedad Ver está establecida en Informe):

//m_strTableOwner es el mismo que el anterior, es un objeto CComboBox

//m_listData es un objeto ClistCtrl

CRecordset rs

CODBCFieldInfo info;

CString strSQL;

m_combTable.GetLBText(m_combTable.GetCurSel(), strSQL);

strSQL = _T("SELECT * FROM " ) + strSQL;

rs.Open(Open(CRecordset::snapshot, strSQL, CRecordset::readOnly);

int nColumns = rs.GetODBCFieldCount();

for (int nNum = 0; nNum < nColumnas; nNum++)

{

prs->GetODBCFieldInfo(nNum, info);

m_listData. InsertColumn(nNum, info.m_strName, LVCFMT_LEFT, 80)

}

Además, podemos usar la función CRecordSet:: GetFieldValue para obtener el registro señalado por el cursor en el conjunto de registros. especificando el nombre de la columna o la secuencia de la columna

El valor de CRecordset::AddNew, CRecordset::CancelUpdate, CRecordset::Delete, CRecordset::Edit,

CRecordset::Update y otras funciones operan la tabla abierta por CRecordset