Sie sind auf Seite 1von 16

Acccsn a una basc dc datns My5QL dcsdc VIsua!

C++
ulilizando las AIIs que piovee MySQI
Ivan Cachicatari Poma
Universidad Nacional del Altiplano Per
12Ago2003
E-mail: ivancp@latindevelopers.com
Web: www.latindevelopers.com
Rcsumcn:
Ll piesenle ailiculo nueslia paso a paso cono cieai una pequea
aplicacin en Visual C++ 6.O con acceso a una lase de dalos de
MySQI, ulilizando lilieias piovedas e incluidas en la
disliilucin de MySQI 4.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Contenido
Paso 1: Crear el proyecto ........................................................................ 3
Paso 2: Manos a la obra........................................................................... 5
Paso 3: Configurar las rutas ................................................................... 6
Paso 4: Ajustar la configuracin del proyecto. ...................................... 8
Paso 5: Crear la base de datos .............................................................. 10
Paso 6: Escribir el cdigo fuente........................................................... 11
Paso 7: Establecer la conexin .............................................................. 13
Paso 8: Ejecutar la consulta. ................................................................. 14
Paso 9: Resultados.................................................................................. 16
ReIerencias: ......................................................................................... 16
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 1: Crcar c! prnycctn
Aqu enpezanos, lodo esle pioceso paiece conplicado peio en
iealidad es censillo,.alslnganse de leei sle pasos quienes ya liene
idea cono cieai un esquelelo de una aplicacin Win32 con el
AppWizaid del Visual C++.
ueno... piocedenos a cieai el pioyeclo nedianle el AppWizaid
del Visual C++ 6.O, podenos laceilo accediendo al nen Iile
Nev (Clil. + N), apaiecei algo cono en la Inagen 1.
Lscogenos pioyeclo MIC AppWizaid (.exe), paia el pioyeclo
escog el nonlie TeslMySQI, eslo aulonlicanenle cieai una
caipela con lodos los elenenlos necesaiio, es ieconendalle que
esla caipela esl siluado en un lugai eslialgico.
Ln ni caso los pioyeclos los guaido en la unidad D: en la caipela
!740.98, usled puede escogei olio diiecloiio paia sus pioyeclos,
lodo eslo es poi un piincipio de oiden.
Imagcn 1. Agrcgandn un nucvn prnycctn.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Ln el siguienle dialogo escogenos el lipo de aplicacin Dialog
ased (asado en dialogo). Ya que esle e un pioyeclo cuyo
oljelivo es denosliai el uso de las lilieias AII de MySQI solo
cieaienos un pioyeclo de ese lipo poi que no necesilanos lodo el
cdigo que geneia paia las olias aplicaciones, en caso de que lenga
que cieai pioyeclos nas giandes puede escogei las olias opciones.
Vei Inagen 2.
Una aplicacin asada en Dialogo geneia lies clases lsicanenle:
una clase deiivada de CWinApp que sei la aplicacin
piopianenle dicla, olia clase deiivada de CDialog aconpaada de
un foinulaiio en llanco paia dai iienda suella a nueslia
inaginacin y olia clase deiivada de CDialog que conliene
infoinacin aceica de la aplicacin.
Imagcn 2. Pasn 2 dc! AppWIzard
Ios siguienles dilogos de opciones son iiielevanles a lo que
necesilanos as es que click en Iinisl y nos olvidanos de esle
asunlo de una luena vez. Apaiecei un dilogo que nos infoinai
lo que eslanos geneiando. No lace falla decii que lay que lacei
clic en el loln de OK. peio ya lo dije. :D
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 2: Manns a !a nbra.
Io piineio que se nos viene a la visla es un dilogo en llanco con
dos lolones y un conliol slalic, no es gian cosa peio peoi es nada.
Aloia viene el lialajo sucio de nodificai esle foinulaiio lasla que
quede de la naneia cono se nueslia en la Inagen 3. Tu nisno
puedes aconodai cono le paiezca nejoi segn lus necesidades.
Imagcn 3. Fnrmu!arIn mndIfIcadn dcspus dc !a crcacIn dc! prnycctn.
Ll diseo anleiioi inlenla aconodaise nejoi a lo que vanos a
iealizai, pues si no lo lesle anles inplenenlaienos una
aplicacioncila con conexin a una lase de dalos MySQI y
ensanllaienos una queiy que ejeculaienos con esa conexin y
nosliaienos los iesullados en el conliol CIisl. sico no!. Claio
que es lsico, peio es de nucla ulilidad paia lacei aplicaciones
nuclo nas giandes en lase a esle ejenplo, lodo depende de lu
inaginacin ya que pienso yo que la piogianacin nas all de sei
una ciencia lanlin es un aile.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 3: CnnfIgurar !as rutas
Anles de conpilai el pioyeclo delenos configuiai algunas
opciones.
Iaia podei lialajai con las opciones es necesaiio agiegai algunas
iulas a los diiecloiios de inclusin y lilieias con las que se van a
conpilai nueslio pioyeclo.
Ln las iulas de inclusin (Include files) agieganos la iula donde
se encuenlia el diiecloiio Inc!udc del MySQI, geneialnenle se
inslala en c:\mysq!\Inc!udc peio en ni caso inslal el MySQI en
C:\Seiveis\nysql, es necesaiio que nodifiquen esla opcin
anles de queiei conpilai el pioyeclo. Vei Inagen 4. Sino lendin
piollenas al nonenlo de linkai el pioyeclo.
De sle diiecloiio (c:\nysql\include ) usaienos el aiclivo
mysq!.h, que nos seivii paia ulilizai las funciones de conexin
que nos piopoiciona MySQI paia C.
Imagcn 4. CnnfIguracIn dc !as rutas dc Inc!usIn.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Al igual cono en el caso anleiioi lanlin lay que agiegai el
diiecloiio !Ib de MySQI que se encuenlia geneialnenle en
C:\My5QL\!Ib\dcbug peio en ni caso esla en
C:\seiveis\nysql\lil\delug.
De sle diiecloiio usaienos el aiclivo !Ibmy5QL.!Ib, paia la
conpilacin. Ls inpoilanle copiai el aiclivo !Ibmy5QL.d!! en el
diiecloiio OulIul que se desciile nas adelanle.
Imagcn 5. CnnfIguracIn dc !as rutas dc !Ibrcras.
IMPORTANTE. Lslanos ulilizando las lilieias dcbug. Ieio poi
qu` Ioi defeclo el AppWizaid ciea aplicaciones con dos
configuiaciones Delug y Release, eslas dos configuiaciones
son lolalnenle dislinlas, la configuiacin Delug (Depuiacin)
geneia un ejeculalle o dll que conliene infoinacin paia podei
depuiailo en lienpo de ejecucin si es que nos escapaia algn
punleiillo nal diseccionado o quiz aclualizai venlanas que no
exislen, elc. Ln canlio la configuiacin Release (Ianzanienlo)
geneia un aiclivo ejeculalle o dll oplinizado al nxino, no
conliene infoinacin paia podei depuiailo y geneialnenle el
aiclivo es pequeo en conpaiacin al geneiado con la olia
configuiacin, se dele ulilizai esla configuiacin paia cuando
lenganos que enliegai el pioyeclo con su inslalalle y sin eiioies.
Dele canliai la configuiacin segn iequieia.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Iaia cuando quieia conpilailo con la configuiacin Release
lanlin deleis canliai la iula de lilieias poi C:\nysql\lil\opl.
Pasn 4: Ajustar !a cnnfIguracIn dc!
prnycctn.
Iuego de lacei lodas las laieas anleiioies piocedenos a nodificai
la configuiacin geneial del pioyeclo, paia no lenei nayoies
piollenas con los aiclivos geneiados pondienos los aiclivos
finales en el diiecloiio OutPut en ese diiecloiio copiaienos el
aiclivo !Ibmy5QL.d!! paia que nueslia aplicacin coiia sin ningn
piollena. Vei Inagen 6. Tanlin siive copiailo al diiecloiio del
sislena. peio no lo ieconiendo.
Ln la peslaa Ceneial deles canliai la casilla de Oulpul files,
que liene cono valoi poi defeclo Delug, poi OulIul.
Ln la peslaa siguienle Delug colocai OulIul en el diiecloiio
de lialajo (Woiking diiecloiy). Lslo nos evilai piollenas de
ulicacin del aiclivo lilnySQI.dll al ejeculai desde el Visual
C++. Ioi defeclo esla casilla esla vaca.
Imagcn 6. CnnfIguracIn dc! dIrcctnrIn dc trabajn.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Ln la peslaa Iink agiegai el lexlo lilnySQI.lil en la casilla
de Oljecl/Iiliaiy nodules, esla casilla se usa paia deciile a
conpiladoi que ulilice lilieias exlias al nonenlo del la
consliuccin final del ejeculalle.
Imagcn 7. CnnfIguracIn dc !Ibrcras para !a cnmpI!acIn
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 5: Crcar !a basc dc datns
Ljeculai los siguienles conandos SQI en el seividoi MySQI, vea
usled la nejoi naneia de laceilo. ya ne aluii en explicai
delalladanenle los pasos. :D
#
# Host: localhost Database: prueba
#--------------------------------------------------------
# Server version 4.0.14-max
#
# Table structure for table 'empresas'
#
DROP DATABASE IF EXISTS PRUEBA_DB;
CREATE DATABASE PRUEBA_DB;
DROP TABLE IF EXISTS Empresas;
CREATE TABLE IF NOT EXISTS Empresas (
RUC varchar(8) NOT NULL,
RAZONSOCIAL varchar(50) NOT NULL,
PRIMARY KEY (RUC),
KEY RAZONSOCIAL (RAZONSOCIAL)
);
#
# Dumping data for table 'empresas'
#
INSERT INTO empresas VALUES("10000293","SANCHEZ TUTUSIMA
CARMEN ROSA");
INSERT INTO empresas VALUES("10000347","VELAZCO BERROA
PETRONA");
INSERT INTO empresas VALUES("10000447","PRADO DE ORBE TULA
RORA");
INSERT INTO empresas VALUES("10000794","ANDIA MARQUEZ LUIS
MELITON");
. . . .
# El resto de registros lo puede rescargar de la pagina
del autor
. . . .
INSERT INTO empresas VALUES("10000996","REINOSO MORI JORGE
WILLY");
Estos registros fueron obtenidos con mysqIdump.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 6: EscrIbIr c! cdIgn fucntc
Ln la Clase CTcstMy5QLD!g agieganos la siguienles vaiialles, se
ieconienda que eslas vaiialles sean piolegidas.
class CTestMySQLDlg : public CDialog
{
. . . . .
// Implementation
protected:
MYSQL * m_link_db; //Conexin a la Base de datos
bool m_bChanged; //Indicador de modificacion
//del cuadro de texto
. . . . .
};
Ia vaiialle que nos peinilii eslallecei la conexin al seividoi
MySQI es n_link_dl, es de lipo punleio con el fin de conliolai
nejoi la conexin.
Iuede iealizai eslas opeiaciones con los asislenles que liene Visual
C++, peio es ieconendalle laceilo si es que iealnenle sale los que
esla esciiliendo, con el cuidado de no conelei eiioies que sein
difciles de enconliai luego.
Lsla vaiialle sei inicializada a NUII, y la vaiialle n_lClanged
a false.
A conlinuacin el cdigo del consliucloi:
CTestMySQLDlg::CTestMySQLDlg(CWnd* pParent /*=NULL*/)
: CDialog(CTestMySQLDlg::IDD, pParent)
{
m_link_db = NULL;
m_bChanged = false;
//{{AFX_DATA_INIT(CTestMySQLDlg)
//}}AFX_DATA_INIT
m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
}
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Iuego de iealizai eslas laieas, agiegai las vaiialles n_sIillei y
n_iesull paia los conlioles CLdil y CIislClil iespeclivanenle con
la MIC ClassWizaid (Clil + W).
Ia vaiialle n_sIillei es de lipo CSliing enlazado al ID del conliol
IDC_QULRY, la vaiialle n_iesull es de lipo CIislClil enlazado al
conliol IDC_RLSUIT.
Iuego de iealizai eslas opeiaciones quedai cono se nueslia en la
Inagen 8.
Imagcn 8. MFC C!assWIzard
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 7: Estab!cccr !a cnncxIn
Iaia eslallecei la conexin a l seividoi MySQI agieganos un
nlodo que iealice esla opeiacin.
bool CTestMySQLDlg::OpenData()
{
m_link_db = new MYSQL;
mysql_init(m_link_db);
//Modificar estas variables segun se necesite
CString sHost = _T("localhost");
CString sUser = _T("root");
CString sPassword = _T("");
CString sDatabase = _T("prueba_db");
if (!mysql_real_connect(
m_link_db, // Objeto de conexion de base de
datos
sHost,
sUser,
sPassword,
sDatabase,
3306, // Puerto de conexion
NULL, // Unix socket
0)) // Otras opciones del cliente
{
CString strText;
strText.Format ( "Error:\n'%s'",
mysql_error(m_link_db));
MessageBox(strText);
return false;
}
return true;
}
Lsle nlodo lo llanaienos en el OnInilDialog , OnInilDialog es el
nlodo que inicializa los conlioles del dilogo, peio la funcin de
conexin puede sei llanada lanlin en el consliucloi o cono
gusles, lolal, lo que se quieie es que se eslallezca la conexin.
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
Pasn 8: Ejccutar !a cnnsu!ta.
Iaia ejeculai la consulla agieganos un nlodo enlazado al evenlo
del loln uscai, desciilii cada una de las funciones que
ulilizaienos:
mysq!_rca!_qucry : Ljecula una consulla SQI, el painelio de
consulla necesila la longilud de la consulla en caiacleies.
int mysql_real_query(
MYSQL *mysql, // enlace a la base de datos
const char *query, // Consulta como cadena
unsigned long length ); // Longitud de la consulta
mysq!_stnrc_rcsu!t: Reloina lodos los iegislios de la ullina
consulla ejeculada a una esliucluia MYSQI_RLS . Reloina NUII
si no lay iesullados que nosliai.
MYSQL_RES *mysql_store_result(MYSQL *mysql)
mysq!_fctch_rnw: Reloina el siguienle iegislio de una consulla,
esle nlodo dele sei llanado despus de nysql_sloie_iesull.
Reloina NUII si no lay nas iegislios.
MYSQL_ROW mysql_fetch_row(MYSQL_RES *result)
mysq!_frcc_rcsu!t: Iileia la nenoia usada de un iesullado de
consulla ollenido nedianle nysql_sloie_iesull.
void mysql_free_result(MYSQL_RES *result)
Ll algoiilno de iecupeiacin de los iesullados es sinple:
1. Aclualizai dalos de los conlioles.
2. Consliuii la consulla en lase a la vaiialle ollenida del
cuadio de lexlo y usailo cono fillio.
3. Ljeculai la consulla.
4. Si lay iesullados elininai el conlenido de la lisla y iecoiiei
los iegislios del iesullado e ii agiegando cada fila del
iesullado a la lisla. (lacenos la clanla de un dalagiid peio
lenenos el conliol de lodo. es puclo nas oplino no cieen)
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
5. Iileiai los iesullados de la consulla.
CdIgn fucntc dc! mtndn dc !a cnnsu!ta.
void CTestMySQLDlg::OnFind()
{
CWaitCursor x;
UpdateData(); // 1
if(!m_sFilter.IsEmpty()){
CString sql,format;
// 2
format = _T("SELECT RUC,RAZONSOCIAL FROM EMPRESAS
WHERE
RAZONSOCIAL LIKE '%s%%'");
sql.Format(format,m_sFilter);
if(mysql_real_query(m_link_db,sql,sql.GetLength()) ==
0 ){
MYSQL_RES* res;
if ((res = mysql_store_result(m_link_db))){
m_result.DeleteAllItems(); // 4
MYSQL_ROW currentRow;
CString tmp;
INT item = 0;
while ((currentRow = mysql_fetch_row(res))){
//Obteniendo valores de la columna RUC
tmp.Format ("%s", currentRow[0]
?(char*) currentRow[0] : "NULL");
m_result.InsertItem(item,tmp);
//Obteniendo valores de la columna
RazonSocial
tmp.Format ("%s",
currentRow[1] ? (char*) currentRow[1] :
"NULL");
m_result.SetItemText(item,1,tmp);
item++;
}
// 5
mysql_free_result(res);
}
}
Base de datos MySQL desde VisuaI C++ usando MySQL API
Ivan Cachicatari Poma
}
}
Pasn 9: Rcsu!tadns
Imagcn 9. Prngrama cn AccIn
Ioi favoi enviai los conenlaiios y consullas a ivancpvialcp.con,
o visila vvv.piogianacinon.uni.cc/pij/vc/nysql_api/.
Iixina enliega:
N Llaloiacin de un foinulaiio que efecle las olias
opeiaciones fundanenlales de SQI cono son Aclualizacin,
Llininacin, elc.
Referencias:
N MySQI Refeience Manual, MySQI A
N vvv.nysql.con
N vvv.nysql.con/api/

Das könnte Ihnen auch gefallen