paskola   28-08-2024, 04:35
#1
Hola. Estoy haciendo una aplicación sencilla que va a conectarse a un servidor corriendo MSSQL y extraer algo de información para presentarla en un tableview. La cuestiónes que para no hacer lenta la aplicación opté por crear procedimientos almacenados (stored procedures) que ya solo me regresan la información y todo el procesamiento s ¿e hace en el servidor. El problema es que no logro que los métodos EXEC y SUBST me regresen la información. Termino con 'UNABLE TO FETCH ROW'. 

Ya he probado todas las opciones que puedo imaginar para enviarlo:

rs = con.EXEC("execute spProcedimiento valor")
rs = con.EXEC("execute spProcedimiento &1", variable) 
rs = con.EXEC("execute spProcedimiento " & variable)
rs = con.EXEC("execute spProcedimiento " & textboxt.text)

Y todos invariablemente terminan en ese error. Si cambió la sentencia por ejemplo a "SELECT TOP 1 * from tabla" entonces meregesa sin problema datos y puedo manipularlos asi que esto aconfirm que si hace la conexión a la base de datos de forma correcta. 

También ya he probado ejecutar esa consulta desde la terminal con isql y ahi funciona sin problemas. Supongo que debe ser algo muy sencillo y obvio porque según la documentación de gambas dice que exec puede ejecutar cualquier sentencia de SQL.

Agradecería si alguno de ustedes me saca de la misería.
Shordi   28-08-2024, 09:33
#2
Nunca he probado, y no creo que funcione con el driver de gambas, así a bote pronto, la ejecución de un procedimiento almacenado. Yo probaría, si es que es necesario que el tema se resuelva en el servidor, con vistas. Una vista se crea y ejecuta en el servidor y encadenando varias (vistas sobre vistas) es posible hacer cosas muy complejas que luego se resuelven con un select sencillo desde la parte cliente.

Sin más datos no puedo decirte más pero, ya te digo, exec(execute... puede que en el servidor funcione, es decir puede que el procedimiento almacenado sí se ejecute, pero no retorna un valor que gambas reconozca.

Saludos

No podemos regresar
Harpo   28-08-2024, 13:36
#3
Hace muchos años que no trabajo con MSSQL, la última versión que recuerdo es la 2005. Hacíamos un uso intensivo de procedimientos almacenados y si no recuerdo mal estos no devolvían el resultado de una sentencia Select, si variables que luego se revisamos.

No sé si es posible lanzar el procedimiento almacenado y luego la sentencia desde un script de base de datos, algo parecido a esto:
Código:
-- Script_SQL
exec mi_procedimiento
go
select * from tabla_resultados

Y en gambas
Código:
hResult = hODBC_Conn.Exec(Script_SQL)

Escribo de memoria, no sé si ese código funcionará.
Un saludo, Harpo.
Shordi   29-08-2024, 10:04
#4
Había leído MYSQL en lugar de MSSQL. ¿Qué driver usas para acceder a esa base de datos? ¿ODBC? o es que funciona con el de Mysql o qué. Turulato me has dejado.

Saludos

No podemos regresar
paskola   30-08-2024, 02:08
#5
Es MSSQL y estoy conectándome por odbc. Como dije si tiro un SELECT normal si funciona y puedo obtener datos pero ejecutar un store procedure y pasarle un argumento no. Y lo que me está rebanando la mente es que ya lo habia logrado hacer, osea, ya me habia funcionado y reorganice el código y los controles en la pantalla y ya, error.

Y en realación a usar las vistas, si lo consideré pero las tablas que consulto dos de ellas tienen un par de millones de registros, entonces cada vez que le haga un select a la vista sería muy lento y podria causar bloqueos que afecten otros procesos. De hecho tuve que refinar mucho la consulta para hacerla ágil.

Pues seguiré intentando como dijo Harpo formando una cadena con mi sentencia en SQL y pasarla al método EXEC de la conexión. 

Ya veremos si anda.

Un abrazo.

Y tal como lo dije: era algo obvio. Resulta que el error no estaba en el código en gambas sino en el codigo sql osea en el stored procedure en sí. Al final del código en SQL estaba una sentencia de GRANT que no tenía nada quie ver con el procedimiento pero el método EXEC también lo ejecutaba y no obtenía un resultado es decir un registro o renglón. Y de alli el Unable to fetch row. Corregí el procedimiento, corrí de nuevo mi programa y allí están los benditos resultadois al fin.

Así que si amigos, es posible ejecutar un Stored procedure desde Gambas y de forma muy rudimentaria lo lohgré asi:

 
Código:
  
    Dim con As New Connection
    con.Type = "odbc"   ' Driver que se usa para conectar a la base
    con.Host = "Servidor" 'este nombre debe coincidir con el que está en /etc/odbc.ini
    con.Name = "BaseDeDatos" 
    con.User = "Usuario"
    con.Password = "PasswordMegaSeguro"
    con.Open

    ' Y después ejecuto el stored procedure:

    rs = con.exec("exec spinfo " & txAN8.text)

Después ya puedo tomar los datos guardados en rs y presentarlos en pantalla.

Y así me despido por el camino de la verguenza. Ahora voy aprender como hacer lo anterior de una manera más profesional.
 
Saludos
Última modificación: 30-08-2024, 02:55 por paskola.
Shordi   30-08-2024, 09:35
#6
Nada de vergüenza, ese intento y error nos ha enseñado algo a todos. La magia de compartir.

Saludos

No podemos regresar
Harpo   30-08-2024, 23:14
#7
Como dice Shordi, nada de vergüenza. A mí cuando me pasan cosas así, me acuerdo de la Mars Climate Orbiter, y me echo unas risas. Una sonda enviada a Marte, el sistema de navegación de la sonda esperaba datos en sistema métrico decimal, Control de Vuelo en la Tierra los enviaba en el sistema métrico anglosajón. Eso sí que es una cagada épica.

Saludos, Harpo.
  
Usuarios navegando en este tema: 3 invitado(s)
Powered By MyBB, © 2002-2024 MyBB Group.
Made with by Curves UI.