Jueves 14 de Noviembre de 2024, 04:10
SoloCodigo
Bienvenido(a),
Visitante
. Por favor,
ingresa
o
regístrate
.
¿Perdiste tu
email de activación?
Inicio
Foros
Chat
Ayuda
Buscar
Ingresar
Registrarse
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Visual C++ MySQL Server Embebido
« anterior
próximo »
Imprimir
Páginas: [
1
]
Autor
Tema: Visual C++ MySQL Server Embebido (Leído 1937 veces)
Señor X²
Nuevo Miembro
Mensajes: 16
Visual C++ MySQL Server Embebido
«
en:
Martes 31 de Marzo de 2009, 23:45 »
0
Hola, hace un tiempo programo en Visual C++ 2008 usando las API y accediendo a MySQL también por medio de las API, hasta ahí todo bien, el tema es que ahora quiero usar la opción de servidor embebido haciando uso de la librería libmysqld.dll, para no tener que instalar MySQL en cada máquina donde voy a ejecutar mis programas. Pero no he podido hacerlo andar, hace un par de semanas ya que vengo renegando con esto y no he podido hacerlo andar.
Encontré mucha información, pero toda para Linux y lo que me interesa es sobre windows.
En esta página hay un tutorial que lo explica en windows y el linux, pero no he podido hacerlo andar, se produce un error en tiempo de ejecución y se cierra todo
hxxp://shivasdairy.blogspot.com/2007/01 ... erver.html
(puse hXXp porque no tengo privilegios para publicar enlaces) perdón si no se puede
Muchas Gracias
Tweet
Señor X²
Nuevo Miembro
Mensajes: 16
Re: Visual C++ MySQL Server Embebido
«
Respuesta #1 en:
Martes 5 de Mayo de 2009, 15:41 »
0
bueno, después de un tiempo pude hacerlo andar, si a alguien le interesa, avisen
jhonpoiron
Nuevo Miembro
Mensajes: 1
Re: Visual C++ MySQL Server Embebido
«
Respuesta #2 en:
Miércoles 20 de Mayo de 2009, 20:31 »
0
Hola. creo que soy un novato en aplicaciones que incrusten mysql. por lo tanto me interisaria los pasos necesarios para embeber mysql desde visual. DE antemano gracias por la atencion prestada.
POIRON
Señor X²
Nuevo Miembro
Mensajes: 16
Re: Visual C++ MySQL Server Embebido
«
Respuesta #3 en:
Jueves 21 de Mayo de 2009, 16:13 »
0
· Incluimos
Código: C++
#include "winsock.h"
#include "mysql.h"
· Asignamos la dependencia a la librería libmysqld
Project -> Properties (ALT+F7)
Configuration Properties -> Linker -> Input
Additional Dependencies libmysqld.lib
El archivo se encuentra ubicado en: C:Archivos de programaMySQLMySQL Server 5.1EmbeddedDLLrelease o debug, respectivamente.
Si no se encuentra el archivo, ver la instalación de MySQL, ya que nos ofrece instalar o no los archivos del servidor embebido.
Entonces programa necesita el archivo libmysqld.dll para correr, de unos 6 MB.
· Creamos en archivo de configuracion del servidor
Creamos el archivo my.ini con el siguiente contenido
Citar
[libmysqld_server]
datadir = C:/datadir
language = C:/windows/
[libmysqld_client]
language = C:/windows/
· Conectamos al servidor
Código: C++
static
char
*
server_options
[
]
=
{
"mysql_test"
,
"--defaults-file=C:/Windows/my.ini"
,
NULL
}
;
int
num_elements
=
(
sizeof
(
server_options
)
/
sizeof
(
char
*
)
)
-
1
;
static
char
*
server_groups
[
]
=
{
"libmysqld_server"
,
"libmysqld_client"
,
NULL
}
;
mysql_library_init
(
num_elements, server_options, server_groups
)
;
myData
=
mysql_init
(
NULL
)
;
mysql_options
(
myData, MYSQL_READ_DEFAULT_GROUP,
"libmysqld_client"
)
;
mysql_options
(
myData, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
NULL
)
;
mysql_real_connect
(
myData,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
NULL
,
0
)
;
Si el archivo my.ini no se encuentra en la ruta especificada ahí, la función mysql_library_init falla.
En el archivo my.ini, le especificamos 2 carpetas, datadir y language, datadir, es el directorio donde van los datos de las tablas, etc, y language, es el directorio donde se encuentra el archivo con los mensajes de errores (creo que es para eso
), llamado errmsg.sys el mismo lo encontramos en C:Archivos de programaMySQLMySQL Server 5.1share y el idioma que querramos, yo usé el inglés, pero no creo que haya problemas para usar el español.
MUY IMPORTANTE:
La carpeta datadir, tiene que existir, mysql no la va a crear.
· Cerramos la conexión
Código: C++
mysql_close
(
myData
)
;
mysql_library_end
(
)
;
Por último, para realizar las consultas, basta con usar la función mysql_query en cualquier mensaje, ya sea un botón, o cuando se desee. Por supuesto, para hacer las consultas hay que seleccionar la base de datos, eso lo hacemos usando la consulta “USE prueba” o al usar mysql_real_connect en el parametro numero 5.
Acá te dejo el .cpp completo
Código: C++
// mysql_embedded_visual.cpp : Defines the entry point for the application.
//
#include "stdafx.h"
#include "mysql_embedded_visual.h"
#include "winsock.h"
#include "mysql.h"
#define MAX_LOADSTRING 100
// Global Variables:
HINSTANCE hInst
;
// current instance
TCHAR szTitle
[
MAX_LOADSTRING
]
;
// The title bar text
TCHAR szWindowClass
[
MAX_LOADSTRING
]
;
// the main window class name
/* Declaramos la variable myData */
MYSQL
*
myData
;
// Forward declarations of functions included in this code module:
ATOM MyRegisterClass
(
HINSTANCE hInstance
)
;
BOOL InitInstance
(
HINSTANCE,
int
)
;
LRESULT CALLBACK WndProc
(
HWND, UINT, WPARAM, LPARAM
)
;
INT_PTR CALLBACK About
(
HWND, UINT, WPARAM, LPARAM
)
;
int
APIENTRY _tWinMain
(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int
nCmdShow
)
{
UNREFERENCED_PARAMETER
(
hPrevInstance
)
;
UNREFERENCED_PARAMETER
(
lpCmdLine
)
;
// TODO: Place code here.
MSG msg
;
HACCEL hAccelTable
;
// Initialize global strings
LoadString
(
hInstance, IDS_APP_TITLE, szTitle, MAX_LOADSTRING
)
;
LoadString
(
hInstance, IDC_MYSQL_EMBEDDED_VISUAL, szWindowClass, MAX_LOADSTRING
)
;
MyRegisterClass
(
hInstance
)
;
// Perform application initialization:
if
(
!
InitInstance
(
hInstance, nCmdShow
)
)
{
return
FALSE
;
}
hAccelTable
=
LoadAccelerators
(
hInstance, MAKEINTRESOURCE
(
IDC_MYSQL_EMBEDDED_VISUAL
)
)
;
// Main message loop:
while
(
GetMessage
(
&
msg,
NULL
,
0
,
0
)
)
{
if
(
!
TranslateAccelerator
(
msg.
hwnd
, hAccelTable,
&
msg
)
)
{
TranslateMessage
(
&
msg
)
;
DispatchMessage
(
&
msg
)
;
}
}
return
(
int
)
msg.
wParam
;
}
//
// FUNCTION: MyRegisterClass()
//
// PURPOSE: Registers the window class.
//
// COMMENTS:
//
// This function and its usage are only necessary if you want this code
// to be compatible with Win32 systems prior to the 'RegisterClassEx'
// function that was added to Windows 95. It is important to call this function
// so that the application will get 'well formed' small icons associated
// with it.
//
ATOM MyRegisterClass
(
HINSTANCE hInstance
)
{
WNDCLASSEX wcex
;
wcex.
cbSize
=
sizeof
(
WNDCLASSEX
)
;
wcex.
style
=
CS_HREDRAW
|
CS_VREDRAW
;
wcex.
lpfnWndProc
=
WndProc
;
wcex.
cbClsExtra
=
0
;
wcex.
cbWndExtra
=
0
;
wcex.
hInstance
=
hInstance
;
wcex.
hIcon
=
LoadIcon
(
hInstance, MAKEINTRESOURCE
(
IDI_MYSQL_EMBEDDED_VISUAL
)
)
;
wcex.
hCursor
=
LoadCursor
(
NULL
, IDC_ARROW
)
;
wcex.
hbrBackground
=
(
HBRUSH
)
(
COLOR_BTNFACE
+
1
)
;
wcex.
lpszMenuName
=
MAKEINTRESOURCE
(
IDC_MYSQL_EMBEDDED_VISUAL
)
;
wcex.
lpszClassName
=
szWindowClass
;
wcex.
hIconSm
=
LoadIcon
(
wcex.
hInstance
, MAKEINTRESOURCE
(
IDI_SMALL
)
)
;
return
RegisterClassEx
(
&
wcex
)
;
}
//
// FUNCTION: InitInstance(HINSTANCE, int)
//
// PURPOSE: Saves instance handle and creates main window
//
// COMMENTS:
//
// In this function, we save the instance handle in a global variable and
// create and display the main program window.
//
BOOL InitInstance
(
HINSTANCE hInstance,
int
nCmdShow
)
{
HWND hWnd
;
hInst
=
hInstance
;
// Store instance handle in our global variable
hWnd
=
CreateWindow
(
szWindowClass, szTitle, WS_OVERLAPPEDWINDOW,
CW_USEDEFAULT,
0
, CW_USEDEFAULT,
0
,
NULL
,
NULL
, hInstance,
NULL
)
;
if
(
!
hWnd
)
{
return
FALSE
;
}
ShowWindow
(
hWnd, nCmdShow
)
;
UpdateWindow
(
hWnd
)
;
return
TRUE
;
}
//
// FUNCTION: WndProc(HWND, UINT, WPARAM, LPARAM)
//
// PURPOSE: Processes messages for the main window.
//
// WM_COMMAND - process the application menu
// WM_PAINT - Paint the main window
// WM_DESTROY - post a quit message and return
//
//
LRESULT CALLBACK WndProc
(
HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam
)
{
int
wmId, wmEvent
;
PAINTSTRUCT ps
;
HDC hdc
;
switch
(
message
)
{
case
WM_CREATE
:
{
static
char
*
server_options
[
]
=
{
"mysql_test"
,
"--defaults-file=C:/Windows/my.ini"
,
NULL
}
;
int
num_elements
=
(
sizeof
(
server_options
)
/
sizeof
(
char
*
)
)
-
1
;
static
char
*
server_groups
[
]
=
{
"libmysqld_server"
,
"libmysqld_client"
,
NULL
}
;
mysql_library_init
(
num_elements, server_options, server_groups
)
;
myData
=
mysql_init
(
NULL
)
;
mysql_options
(
myData, MYSQL_READ_DEFAULT_GROUP,
"libmysqld_client"
)
;
mysql_options
(
myData, MYSQL_OPT_USE_EMBEDDED_CONNECTION,
NULL
)
;
mysql_real_connect
(
myData,
NULL
,
NULL
,
NULL
,
NULL
,
0
,
NULL
,
0
)
;
/* Creamos la fuente */
HFONT hfont1
=
CreateFont
(
-
11
,
0
,
0
,
0
,
400
, FALSE, FALSE, FALSE,
1
,
400
,
0
,
0
,
0
,
(
"Ms Shell Dlg 2"
)
)
;
/* Creamos el botón */
HWND hCtrl1_1
=
CreateWindowEx
(
0
,
"BUTTON"
,
(
"Aceptar"
)
, WS_VISIBLE
|
WS_CHILD
|
WS_TABSTOP
|
BS_PUSHBUTTON,
567
,
380
,
95
,
24
, hWnd,
(
HMENU
)
IDC_OK, hInst,
0
)
;
/* Asignamos la fuente al botón */
SendMessage
(
hCtrl1_1, WM_SETFONT,
(
WPARAM
)
hfont1, FALSE
)
;
}
case
WM_COMMAND
:
wmId
=
LOWORD
(
wParam
)
;
wmEvent
=
HIWORD
(
wParam
)
;
// Parse the menu selections:
switch
(
wmId
)
{
case
IDC_OK
:
{
mysql_query
(
myData,
"CREATE DATABASE prueba"
)
;
break
;
}
case
IDM_ABOUT
:
DialogBox
(
hInst, MAKEINTRESOURCE
(
IDD_ABOUTBOX
)
, hWnd, About
)
;
break
;
case
IDM_EXIT
:
DestroyWindow
(
hWnd
)
;
break
;
default
:
return
DefWindowProc
(
hWnd, message, wParam, lParam
)
;
}
break
;
case
WM_PAINT
:
hdc
=
BeginPaint
(
hWnd,
&
ps
)
;
// TODO: Add any drawing code here...
EndPaint
(
hWnd,
&
ps
)
;
break
;
case
WM_DESTROY
:
mysql_close
(
myData
)
;
mysql_library_end
(
)
;
PostQuitMessage
(
0
)
;
break
;
default
:
return
DefWindowProc
(
hWnd, message, wParam, lParam
)
;
}
return
0
;
}
// Message handler for about box.
INT_PTR CALLBACK About
(
HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam
)
{
UNREFERENCED_PARAMETER
(
lParam
)
;
switch
(
message
)
{
case
WM_INITDIALOG
:
return
(
INT_PTR
)
TRUE
;
case
WM_COMMAND
:
if
(
LOWORD
(
wParam
)
==
IDOK
||
LOWORD
(
wParam
)
==
IDCANCEL
)
{
EndDialog
(
hDlg, LOWORD
(
wParam
)
)
;
return
(
INT_PTR
)
TRUE
;
}
break
;
}
return
(
INT_PTR
)
FALSE
;
}
Imprimir
Páginas: [
1
]
« anterior
próximo »
SoloCodigo
»
Foros
»
Programación General
»
C/C++
(Moderador:
Eternal Idol
) »
Visual C++ MySQL Server Embebido