PDA

Ver la Versión Completa : Conexion a MySQL sin BDE ni ODBC


seduerey
03-06-2003, 23:42:39
He probado varias fórmulas para ello.

Estoy usando MySql 4.0, la libreria que incluye esta distribucion, y me da una excepcion cuando intento conectar al servidor de BBDD que he arrancado previamente, es decir, en el mysql_connect.

este es el código que he usado, se activa, como podeis ver, cuando pulsamos el boton(es una prueba muy tonta, lo se).

procedure TForm2.BitBtn1Click(Sender: TObject);
var
mysqlcon: TMySQL; // MySQL-connection structure
presults: pmysql_res; // Pointer to a results structure
begin
// Connect to the server
mysql_connect(@mysqlcon, 'localhost', 'login', 'passw');
if mysqlcon.net.last_errno <> 0 then begin
ShowMessage (Trim(mysqlcon.net.last_error));
exit;
end;
// Open the mysql database
if mysql_select_db(@mysqlcon, 'mysql') <> 0 then begin
mysql_close(@mysqlcon); // Disconnect
ShowMessage('Couldn''t open mysql database');
exit;
end;
presults:= nil;
try
// Send the query to the server and get the results
mysql_query(@mysqlcon, 'SELECT * FROM user');
presults := mysql_store_result(@mysqlcon);
if presults.row_count <> 1 then
ShowMessage('va a ser eso');
finally
mysql_free_result(presults); // Release memory
mysql_close(@mysqlcon); // Disconnect
end;
end;


Se que será lo más tonto de la historia, pero me salvaríais la vida (o casi)

roman
04-06-2003, 01:16:16
// Connect to the server
mysql_connect(@mysqlcon, 'localhost', 'login', 'passw');


La estructura mysqlcon no esta inicializada. Debes hacerlo con

mysql_init(nil)

Por otro lado no sé que tantos cambios hayan para la versión 4 pero hasta la versión 3.xx la forma correcta de obtener los errores es con las funciones mysql_errno() y mysql_error() en lugar de acceder directamente a la estructura net.

También es más fácil si declaras mysqlcon como PMYSQL en lugar de TMYSQL. En Delphi puedes omitir el operador de referencia "^". Esto es, si declaras


var
mysqlcon: PMYSQL;


puedes poner mysqlcon.net en lugar de mysqlcon^.net

// Saludos

seduerey
04-06-2003, 22:51:46
http://www.seduerey.com/error1.jpg

Ya he puesto el codigo que me has dicho y me da la excepcion de ahí arriba, o sea, la misma, pero una línea antes (tengo arrancado el servidor mysqld-opt.exe, que es el que me arranca normalmente para el PHP).

He usado la estructura net xq ya estaba desesperaito de la vida

Un saludo y gracias

roman
04-06-2003, 23:22:37
¿Falla en mysql_init?

La función mysql_init no puede fallar

Dicho esto ahora me explico:

En principio lo único que mysql_init hace es asignar memoria para una estructura TMYSQL y devuelve un apuntador a dicha memoria, de manera que la única razón por la que puede fallar es por falta de memoria en cuyo caso la conexión será el menor de tus problemas :)

Como no creo que este sea el caso, la única razón que imagino es que la estructura TMYSQL no corresponda a la estructura que espera mysql_init.

Esto puede suceder si el archivo pascal que utilizas para acceder a libmysql.dll no corresponde a la versión de esta librería.

No sé qué archivo pascal uses para importar las funciones de libmysql.dll, quizá sea el de Matthias Fichtner (http://www.fichtner.net/delphi/mysql/) que funciona hasta la versión 3.49. Dado que hubo muchos cambios en la versión 4 es posible que debas actualizar aunque desconozco dónde se puede adquirir la actualización.

// Saludos

seduerey
04-06-2003, 23:47:27
No, si lo de que no falla, lo suponia, pero ya ves.

He usado la dll que venia con al distribucion de MySQL que me bajé anteayer, ya que la que tu me dices la tenía y daba el mismo fallo... si está visto que lo que no me pase a mi....

seduerey
04-06-2003, 23:48:31
ah, 256 MB de RAM.... asi que eso no creo :(

@-Soft
05-06-2003, 15:11:11
hola

disculpa mi pregunta, no has pensado en utilizar componentes nativos como el WinZeos que sirven para conectar tablas mysql con delphi.

gracias, buena suerte.

android_beat
06-06-2003, 23:49:22
tengo una gran problema bueno 2 ya puedo conectarme con la libreria libmySQL.dll y mysql.pas y por loq ue e visto esta super rapido pero tengo un problema en esta declaracion

mysql_query(@mysqlcon, 'SELECT * FROM Usuarios Where Usuario="ccedulas"');

quiero que enlugar de teclear el Usuario que quiero que es ccedulas lo ponga yo en un campo y me aga el query

cundo me conectaba por medio de odbc lo hacia haci
Datos.Usuarios.SQL.Add('SELECT * FROM Usuarios WHERE Usuario='+ '''' + Usuario.Text + ''''+ ' AND Contrasena='+ '''' + Contrasena.Text + '''');


como puedo hacer para hacer lo mismo usando las librerias ya que intente acomodarlo pero no sale me marca un error con el pChar() que no son compatibles

bueno el otro problemas es que ya que los baje me ponga todos los registros encontrados en un Ttable

bueno espero y algien me pueda ayudar o que me diga como usar otra coneccion que no sea odbc por que si la ponco por odbc y no por medio de codigo o corba pues te puedes meter a las tablas mysql por medio de un query desde exel y eso como que no es muy seguro

bueno grax y me despido :rolleyes:

seduerey
07-06-2003, 14:05:41
Hola, soy yo de nuevo. Ya consigo conectar, era un problema que arrastraba de otro modulo.

En cuanto a tu problema, android, puedes hacer lo siguiente....

pchar(concat(str1,....,strN));
//pchar te convierte la string en un Pchar.

era eso? sino pues ya dimelo

android_beat
09-06-2003, 19:15:00
mira haci si jala

mysql_query(@mysqlcon, 'SELECT * FROM Usuarios Where Usuario="ccedulas" ');


pero haci no
lo que quiero es no poner yo el ccedulas sino uno desde un .text


y puese esto y no jala

mysql_query(@mysqlcon, 'SELECT * FROM Usuarios Where Usuario='+pchar(concat(usuario.text))+');

:mad: :confused: :confused: :confused: :confused:

roman
09-06-2003, 19:42:53
Posteado originalmente por android_beat
...y puese esto y no jala

mysql_query(@mysqlcon, 'SELECT * FROM Usuarios Where Usuario='+pchar(concat(usuario.text))+');


PChar debe abarcar toda la cadena:


mysql_query(@mysqlcon, PChar('SELECT * FROM Usuarios WHERE Usuario = ' + Usuario.Text + ')'));


Por cierto, aquí el concat no pinta nada.

Yo te recomendaría hacer una función que se encargue de una vez y para siempre del paso de pchar a string. Por ejemplo:


function MyQuery(Conn: PMYSQL; Sql: String);
begin
Result := mysql_query(Conn, PChar(Sql));
end;


Tu consulta quedaría así:


my_query(@mysqlcon, 'SELECT * FROM Usuarios WHERE Usuario = ' + Usuario.Text + ')');


y así con cualquier otra consulta que hagas.

// Saludos

roman
09-06-2003, 20:13:26
Una corrección: en el código anterior, Usuario.Text debe rodearse con las comillas que requiere la consulta. Una forma de hacer esto sin liarse con dobles comillas es con la función QuotedStr:

QuotedStr(Usuario.Text);

// Saludos