PreguntasLinux

Versión Completa: Mysql desde C
Actualmente estas viendo una versión simplificada de nuestro contenido. Para ver la versión completa en el formato correcto, dale click aquí
Hola estoy haciendo un programa para acceder a Mysql desde c (tiene que ser más rapido que PHP)

El problema que tengo es que no domino mucho el lenguaje...

Lo que quiero es lea toda una tabla y la guarde en un array, (Son todo numeros decimales)

Pero no se como hacerlo.

Os pongo el código.
#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;
void err(void) {
fprintf(stderr, "%s\n", mysql_error(&mysql) );
exit(1);
}
int main()
{
int i,g;
int **p ;
int n=3000,m=3000,j=0;
unsigned nn[n][m];
p = (int**) malloc(n*sizeof(int*));

if(!(mysql_real_connect(&mysql,"localhost","root",
"mmm","bolsa",3306,NULL,0))) err();

if(mysql_query(&mysql,"SELECT * FROM cotizaciones")) err();
if(!(res = mysql_store_result(&mysql))) err();

while((row = mysql_fetch_row(res)))
{
p[j] = (int*)malloc(m*sizeof(int));
for (i=0 ; i < mysql_num_fields(res); i++)
{
p[i][j]=row[i];
/// Esto no funciona, quiero grabar el resultado en el ARRAY p
}
j++;
}
if (!mysql_eof(res)) err();
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}

Saludos.
Mirá, te recomiendo que vayas de a poco, primero hace el código de conexión de la base de datos y probalo, si anduvo, despues trata de hacer una consulta y mostralo por pantalla. De otra forma te va a tirar 20 errores y no vas a saber ni por cual empezar. Bueno, ese es el consejo que te doy si recien empezas con el lenguaje.

También ayudaría si especificás que error te tira.

Si me pasas el enlace del manual que estas leyendo por ahi te puedo orientar mejor.

Aca tenes un ejemplo si te sirve http://linuxfocus.org/English/September2...e304.shtml
A la base de datos funciona, y muestra los datos en la pantalla

Este codigo es el que muestra los datos en la pantalla:

#include <stdio.h>
#include <stdlib.h>
#include "mysql.h"

MYSQL mysql;
MYSQL_RES *res;
MYSQL_ROW row;


void err(void) {
fprintf(stderr, "%s\n", mysql_error(&mysql) );
exit(1);
}






int main()
{
int i;


if(!(mysql_real_connect(&mysql,"localhost","root",
"mmm","bolsa",3306,NULL,0))) err();

if(mysql_query(&mysql,"SELECT * FROM cotizaciones")) err();
if(!(res = mysql_store_result(&mysql))) err();
while((row = mysql_fetch_row(res))) {

for (i=2 ; i < mysql_num_fields(res); i++)
{

printf("%s",row[i]); /////////////QUIERO GUARDARLO EN UNA ARRAY TODOS LOS DATOS
}

}


if (!mysql_eof(res)) err();
mysql_free_result(res);
mysql_close(&mysql);
return 0;
}
Aqui tiene un link del manual

http://dev.mysql.com/doc/refman/5.0/en/c.html

Gracias
Muy bien!, ahora, para copiar cadenas de texto tenés que usar funciones. Esta la función sprintf que es la mas facil de usar (pero la mas lenta), te asigna sola la memoria que necesita para guardar. Ejemplo:

Código:
sprintf(mivariablechar,"%s",row[i])

También esta la funcion strcpy que copia las cadenas pero la variable destino tiene que tener el espacio suficiente asignado. Y tambien hay una que se llama strdup que asigna el espacio automaticamente.
Te recomiendo que leas este manual que explica mas en detalle.
http://www.elrincondelc.com/cursoc/cursoc12.html

Por otra parte, si me decís que los datos son tipo float, seguramente te convenga almacenarlos como float. Te dejo la referencia de las funciones para convertir de string a float.
http://www.gnu.org/software/libtool/manu...-of-Floats

Yo como tu ando verde con C, pero. Fijate que en tu codigo no empiezas el objeto Mysql a iniciar...

mysql = mysql_init(NULL);

tambien fijate en esta linea :::

p[i][j]=row[i];

al puntero 'p' le asignas 2 gestores de almacenamiento o sea p[i][j] y fijate que row solo tiene espacio para almacenar 1 columna no 2 como indicas en p. Y esto logicamente es imposible.

Tambien fijate en

int i,g;
int **p ;
int n=3000,m=3000,j=0;
unsigned nn[n][m];

unsigned nn[n][m]; // Y 'nn' de que tipo es??? int? char? string??? no le indicaste un tipo, aunque no uses dicha variable en ninguna parte esto causa un segmentation fault.

Tambien fijate el puntero 'p' asignas memoria 2 veces innecesariamente ya que en ningun momento liberas esa memoria asignada nisiquiera al terminar tu codigo. Tambien ten pendiente los tipos de datos *p es un puntero entero, y row que pertenece a MYSQL_ROW que es de tipo estructura al no ser ambos del mismo tipo, no podras asignar row[i] a p.
URLs de Referencia