Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 11-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Exclamation Error 'SQLQuery1: Cursor not returned from query'.


bueno este es el codigo

Código:
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("show tables");
SQLQuery1->Open();
TBookmarkStr BM= SQLQuery1->Bookmark;
SQLQuery1->First();
 while((!SQLQuery1->Eof)&&((SQLQuery1->FieldByName("Database")->AsString)!="basededatos"))
            SQLQuery1->Next();
SQLQuery1->Refresh();
ClientDataSet1->UpdateCursorPos();
SQLQuery1->Bookmark=BM;
SQLQuery1->Close();
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("use basededatos;");
SQLQuery1->Open();
//use el bookmark como ahora pero no hay cambios

Última edición por grandmasterdari fecha: 12-01-2008 a las 02:45:48. Razón: agregar etiqueta code
Responder Con Cita
  #2  
Antiguo 11-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Hola.

En primer lugar, bienvenid@ al clubdelphi. Te invito a leer la guía de estilo y tamibén el hilo de la calidad de las preguntas.

Con respecto de tu pregunta concreta, hará falta saber cual es el motor de base de datos que usas y la línea en concreto donde salta el error.

En lo particular, no me parece que estes introduciendo SQL válido para ningún motor.

Hasta luego.



pd. He editado tu mensaje original para añadir la etiqueta [ code ], te invito a aprender a usarla, al igual que la etiqueta delphi y sql
__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #3  
Antiguo 11-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 01


gracias.
bueno con respecto al motor de base de datos estoy utilizando mysql 5.0
con borland developer studio 2006 en c++,
tambien tengo los nuevos drivers de mysql ya que el que trae el compilador es para una version anterior del motor de db. (si alguien lo quiere no duden en pedir, ya ke lleva tiempo encontrarlos)

creo que ya saben como es la historia, utilizo esos 2 componentes para consultas:
. . sqlconnection1 -----> sqlquery1
donde sql connection1 ya lo configuro en la vcl y se conecta sin ningun problema respetando el nuevo driver, esto seria en codigo, pues yo hice lo mismo en grafico

Código:
      Connection := TSQLConnection.Create(nil);
      Connection.DriverName := 'dbxmysql';
      Connection.GetDriverFunc := 'getSQLDriverMYSQL50';
      Connection.LibraryName := 'dbxopenmysql50.dll';
      Connection.VendorLib := 'libmysql.dll';
      Connection.Params.Append('Database=NAME_OF_DATABASE);
      Connection.Params.Append('User_Name=NAME_OF_USER');
      Connection.Params.Append('Password=PASSWORD');
      Connection.Params.Append('HostName=localhost');
para realizar comandos sql necesito el tsqlquery instanciado por defecto SQLQuery1

tengo ke pasarle lo que quiero que haga
Código:
 SQLQuery1->SQL->add("show databases");
y las respuestas se quedan almacenadas en ese objeto ¿ como hago para saber que recibio mi objeto?
bueno, aparentemente se encuentra en SQLQuery1->Field tipo de dato TField y como es una especie de tabla lo ke recibo como respuesta realizo una busqueda del campo que me interesa de la siguiente forma
Código:
        while((!SQLQuery1->Eof)&&((SQLQuery1->FieldByName("Database")->AsString)!="basededatos"))
            SQLQuery1->Next();
salgo de esa iteracion cuando, o termina de recorrer y no hay coincidencias, o cuando encuentro la coincidencia.
hasta ahora vamos bien, pero ahora a mi objeto SQLQuery1 quiero hacerle otra consulta por ejemplo
Código:
SQLQuery1->SQL->add("show tables");
pero antes debo borrar la consulta anterior con este comando
Código:
SQLQuery1->SQL->Clear();
y para poder ejecutar mi consulta de show tables hago esta linea
Código:
SQLQuery1->Open();
<- Y ahi esta!!!... esa es la linea, no puedo hacer otras consultas sea cual sea despeus de haber recorride de la forma en la que hice
Código:
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("show tables");
SQLQuery1->Open();
TBookmarkStr BM= SQLQuery1->Bookmark;
SQLQuery1->First();
 while((!SQLQuery1->Eof)&&((SQLQuery1->FieldByName("Database")->AsString)!="basededatos"))
            SQLQuery1->Next();
SQLQuery1->Refresh();
ClientDataSet1->UpdateCursorPos();
SQLQuery1->Bookmark=BM;
SQLQuery1->Close();
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("use basededatos;");  
SQLQuery1->Open(); //el error sale en esta linea

bueno espero haberme expresado bien
no tengo problemas si hay ejemplos en delphi (caral)

Última edición por grandmasterdari fecha: 12-01-2008 a las 02:46:19.
Responder Con Cita
  #4  
Antiguo 11-01-2008
Avatar de Caral
[Caral] Caral is offline
Miembro Premium
 
Registrado: ago 2006
Posts: 7.659
Poder: 25
Caral Va por buen camino
Hola
Ahora me acuerdo por que no me gusta c++
Lo que se podria hacer con un par de lineas en Delphi se complica en c.
Por lo menos a mi me parece, nunca he necesitado crear el objeto Bases de datos, para que ?
Bueno, solo opinion de Novato.
Saludos
Responder Con Cita
  #5  
Antiguo 11-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Muevo el hilo del foro SQL al foro de mySQL, pues el problema está relacionado con esa base de datos y no con el lenguaje SQL en si.

Insisto en el uso de etiquetas, solo que esta vez, te toca a vos editar el mensaje y ponerlas.

Finalmente, siempre he creido que mySQL tiene un dialecto muy extraño. ¿Estas seguro que la instrucción show tables es un SQL válido para ese motor?

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #6  
Antiguo 11-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por Caral Ver Mensaje
Ahora me acuerdo por que no me gusta c++
Lo que se podria hacer con un par de lineas en Delphi se complica en c.
Por lo menos a mi me parece, nunca he necesitado crear el objeto Bases de datos, para que ?
Caral: c++ builder es muy parecido a delphi, la misma VCL disponible en delphi lo está en c++ builder, el IDE tiene prácticamente la misma funcionalidad.

De esa cuenta que sería posible tamibén en c++ builder realizar una aplicación sin crear la base de datos por código, de la misma manera que sería en Delphi posible realizar una aplicación donde esta se realice de esa manera. De hecho, yo he hecho algunas.

Por ejemplo, una que en tiempo de corrida se conectaba a una cantidad configurable de bases de datos, para replicar información entre ellas.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #7  
Antiguo 11-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
mysql

show tables ejemplo

click
Responder Con Cita
  #8  
Antiguo 11-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
El que la herramienta lo acepte, no significa que sea un query válido para el motor.

El mismo comando existe, por ejemplo, en isql de firebird, pero es esta herramienta quien la traduce en el query adecuado. En ese caso podría ser:

Código SQL [-]
select rdb$relation_name table_name
  from rdb$relations
 where rdb$system_flag = 0

Esto lo digo para afirmar mi postura que pueda no ser un sql válido. Realmente desconozco si lo sea o no en el caso de mysql.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #9  
Antiguo 11-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 02

no conozco el isql de firebird, tambien esos comandos son desconocidos para mi, para darle fuerza a mi codigo tengo un ejemplo en esta pagina
pagina

en el cual tiene un codigo (dentro de un zip) que realiza lo mismo que yo
****codigo bajado de otra pagina****
Código:
#include <vcl.h>
#pragma hdrstop

#include "mydbexprForm.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
  : TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonOpenClick(TObject *Sender)
{
  ClientDataSet1->Close();
  ClientDataSet1->Open();
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button1Click(TObject *Sender)
{
  SQLQuery1->SQL->Clear();
  SQLQuery1->SQL->AddStrings( MemoQuerySQL->Lines);
  SQLQuery1->Open(); //     --- aqui  ---
}
//---------------------------------------------------------------------------

void __fastcall TForm1::Button2Click(TObject *Sender)
{
 ClientDataSet1->ApplyUpdates(0);
}
donde "MemoQuerySQL->Lines" contiene el codigo sql a ejecutar.
aparentemente hay que retornar el cursor antes de realizar otro "open()" del SQLQuery1, la pregunta es ¿cómo?

Última edición por grandmasterdari fecha: 11-01-2008 a las 23:29:51.
Responder Con Cita
  #10  
Antiguo 11-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
No hay que retornar nada. Si está abierto, lo cerras con close y luego lo abris con open.

He visto un mensaje de error similar al tuyo, en otros motores.

Ocurre cuando el query no retorna un cursor (según dice el propio mensaje) , que es cuando el query contiene instrucciones como insert/update/delete. En ese caso, en lugar de open (que "abre el query", es decir, procesa el cursor devuelto), se utiliza el método ExecSQL, que ejecuta la sentencia pero no espera obtener un cursor a cambio.

Espero haberme explicado y que de alguna ayuda te sirva.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #11  
Antiguo 11-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 03

claro al ocupar el "SQLQuery1->ExecSQL()", ejecuta la instruccion sql que esta en el atributo SQLQuery1->Text, pero e de aqui, que yo necesito los resultados de la consulta, para poder trabajar con esta,
Responder Con Cita
  #12  
Antiguo 12-01-2008
keyboy keyboy is offline
Miembro
 
Registrado: oct 2004
Posts: 367
Poder: 20
keyboy Va por buen camino
En el código que pones no cierras la primera consulta antes de abrir la segunda. No me parece muy lógico, pero puede ser que por ahí esté el problema, aunque más parece ser problema del driver en cuestión. Y confirmo que "show tables" sí es una consulta SQL válida para MySQL y, similar al SELECT, regresa un cursor, esto es, un conjunto de registros, que para el Dataset debe ser exactamente lo mismo. Por ello es que pienso que se trata de un driver defectuoso.

Bye
Responder Con Cita
  #13  
Antiguo 12-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 04

keyboy, tu duda sobre el driver reforzo mi duda sobre el driver y me puse a buscar otro, probe con uno de "core lab" el cual es pago, me baje la version trial y tambien me da el mismo error, asique lo doy por descartado
Responder Con Cita
  #14  
Antiguo 12-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Creo que solo estamos adivinando. Desde mi primera intervención te pregunté en que línea salta el error. Mientras no lo sepamos... menos clara tendremos la idea, y en ese estado podremos cambiar de driver, de motor de base de datos, de sistema operativo o de herramienta de programación, y probablemente el problema persista.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #15  
Antiguo 12-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 05

la linea del error ya fue marcada, es en el segundo "SQLQuery1->Open()"
Responder Con Cita
  #16  
Antiguo 12-01-2008
[egostar] egostar is offline
Registrado
 
Registrado: feb 2006
Posts: 6.557
Poder: 25
egostar Va camino a la fama
Veamos, hay algo que no entiendo, estas usando un bookmark de otra consulta para usarlo en una diferente????

Código:
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("show tables");
SQLQuery1->Open();
TBookmarkStr BM= SQLQuery1->Bookmark;  //????????????
SQLQuery1->First();
 while((!SQLQuery1->Eof)&&((SQLQuery1->FieldByName("Database")->AsString)!="sircdb"))
            SQLQuery1->Next();
SQLQuery1->Refresh();
ClientDataSet1->UpdateCursorPos(); //?????????????
SQLQuery1->Bookmark=BM; //????????????
SQLQuery1->Close();
SQLQuery1->SQL->Clear();
SQLQuery1->SQL->Add("use basededatos;");  
SQLQuery1->Open(); //el error sale en esta linea
No se, yo creo que por ahi esta el problema.

Salud OS
__________________
"La forma de empezar es dejar de hablar y empezar a hacerlo." - Walt Disney
Responder Con Cita
  #17  
Antiguo 12-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 06

egostar, lo de los bookmarks es un intento desesperado, en realidad no deberia ir ningun bookmark

consegui un ejemplo en su idioma
Código:
 procedure TFormTryMySQL.ConnectButtonClick(Sender: TObject);
 begin
   // Prüfen, ob wir eine aktive Verbindung haben. Falls ja, schliessen wir sie.
   if MySQLConnection1.Connected then CloseConnection(Sender);
   // Die Verbindungsparameter setzen.
   MySQLConnection1.HostName := HostEdit.Text;
   MySQLConnection1.UserName := UserEdit.Text;
   MySQLConnection1.Password := PasswdEdit.Text;
   MySQLConnection1.DatabaseName := 'mysql'; // MySQL ist immer vorhanden!
   ShowString('Opening a connection to server: ' + HostEdit.Text);
   MySQLConnection1.Open;
   // Zuerst eine Liste der verfügbaren Datenbanken abfragen.
   if MySQLConnection1.Connected then begin
     ShowString('Connected to server: ' + HostEdit.Text);
     ShowString('Retrieving list of available databases.');
     SQLQuery1.SQL.Text := 'show databases';
     SQLQuery1.Open;
     while not SQLQuery1.EOF do begin
       DatabaseComboBox.Items.Add(SQLQuery1.Fields[0].AsString);
       SQLQuery1.Next;
     end;
     SQLQuery1.Close;
     ShowString('List of databases received!');
   end;
 end;
es identico a lo que tengo, pero en c++, ahora... este chico solo usa un "open" y claro... con uno solo cualquiera lo hace

fuente -> aqui
Responder Con Cita
  #18  
Antiguo 12-01-2008
Avatar de jachguate
jachguate jachguate is offline
Miembro
 
Registrado: may 2003
Ubicación: Guatemala
Posts: 6.254
Poder: 28
jachguate Va por buen camino
Cita:
Empezado por grandmasterdari Ver Mensaje
la linea del error ya fue marcada, es en el segundo "SQLQuery1->Open()"
Bueno... la verdad desconozco si en mySQL es un query válido eso de use basededatos;, pero si lo es, dudo que devuelva un cursor. ¿estas seguro de eso?

En segundo lugar, en este mensaje dijiste que se trata de un open, pero nunca aclaraste que se tratase del segundo. Desde el inicio era obvio que era un Open el que originaba el error... no me imagino a otra instrucción provocando un error como este.

La solución que te he dado (si es que es esto), estoy seguro que si hubieses intentado al menos comprender lo que ya te he dicho antes, pudiste alcanzarla por vos mismo.

Hasta luego.

__________________
Juan Antonio Castillo Hernández (jachguate)
Guía de Estilo | Etiqueta CODE | Búsca antes de preguntar | blog de jachguate
Responder Con Cita
  #19  
Antiguo 12-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Post Aclaracion 07

"use basededatos;" bueno "basededatos" es el nombre de mi base de datos. tambien podriamos llamarla negocio, por lo tanto quedaria asi "use negocio".
Cuando iniciamos sql, el no sabe que base de datos vamos a ocupar (varia segun usuario) entonces hay que decirle cual queremos usar con el famoso "use".
Entonces "basededatos" es una abstraccion del nombre de la base de datos ke vamos a ocupar.
Bueno, el error esta en el segundo OPEN, porque aparentemente ya ocupe el OPEN antes.
Responder Con Cita
  #20  
Antiguo 12-01-2008
Avatar de grandmasterdari
grandmasterdari grandmasterdari is offline
Miembro
 
Registrado: ene 2008
Posts: 46
Poder: 0
grandmasterdari Va por buen camino
Thumbs up Solucionado

antes que nada sepan disculpar mi estupidez, y gracias por su tiempo.

la idea era esta:
1) que el programa (al iniciar) compruebe la conexion con el motor de base de datos
2) que compruebe (al iniciar) si existe la base de datos con la que vamos a trabajar
3) que compruebe si estan todas las tablas que vamos a utilizar

este es una parte del codigo para comprobar, conexion, base de datos y tablas,

Código:
void __fastcall TForm1::FormCreate(TObject *Sender)//se ejecuta cuando se crea el formulario principal
{

	//comprobacion de conexion
	SQLConnection1->Connected=true;
	if(SQLConnection1->Connected==false){
		MessageBox(NULL,"No se puede establecer la conexion con la base de datos","Error",MB_OK);

		//bloquear botones
		Button8->Enabled=false;  //boton login

	}
	else{
		//comprobacion de base de datos
		SQLQuery1->SQL->Clear();
		SQLQuery1->SQL->Add(codec("show databases");
		SQLQuery1->Open();
		while((!SQLQuery1->Eof)&&((SQLQuery1->FieldByName("Database")->AsString)!="sircdb"))
			SQLQuery1->Next();
		if(SQLQuery1->Eof==true){
			MessageBox(NULL,"No se encuentra la base de datos sircdb","Error",MB_OK);

			//bloquear botones del formulario principal, por ahora tengo 1 nomas
			Button8->Enabled=false;  //boton login
			SQLQuery1->Close();//cierro por las dudas, no se si hace falta ya que el programa solo da la opcion para cerrarse
		}
		else{
			//uso de la base de datos, que ya se que existe
			SQLQuery1->Close();
			SQLQuery1->Open();
			SQLQuery1->SQL->Clear();
			SQLQuery1->SQL->Add("use sircdb;");
			SQLQuery1->ExecSQL(true);//para poder ejecutar el comando
                        //en esta parte empiezo a contralar si estan todas las tablas
			SQLQuery1->SQL->Clear();
			SQLQuery1->SQL->Add("show tables;");
			SQLQuery1->Open();//jejeje. no hay error.
                        //y aqui deberiamos hacer el mismo recorrido anterior (while(!SQLQuery1->Eof  bla bla))
                        //con los condicionales necesarios para la comprobacion de todas las tablas


		}//cierro el else de db
	}//cierro el else de conexion
	SQLQuery1->Close();
}
encontre el error gracias a jachguate porque dijo esto
"Bueno... la verdad desconozco si en mySQL es un query válido eso de use basededatos;, pero si lo es, dudo que devuelva un cursor"
y es verdad, realice un "use basededatos" (en mi codigo "use sircdb"), y esto no devuelve un cursor por eso no se puede realizar el metodo "SQLQuery1->Open()", solo se puede el "SQLQuery1->ExecSQL()"


gracias a jachguate, caral, keyboy y egostar por ayudar

Última edición por grandmasterdari fecha: 12-01-2008 a las 03:58:34.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Error Creating cursor handle jose_205711 Conexión con bases de datos 3 06-11-2010 10:04:02
Error creating cursor handle miguel_fr SQL 6 02-01-2007 12:47:09
Error: puntero no regresa de la consulta o Cursor not Returned from query The_figo MySQL 0 23-11-2006 20:08:55
error "Subquery returned more than 1 value" lynu SQL 1 14-08-2006 16:16:25
¿Por qué me da este error?Error creating cursor manejador nuri SQL 2 01-08-2005 17:30:28


La franja horaria es GMT +2. Ahora son las 07:46:43.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi