Página 1 de 1

error en consultas SQLite y duda (solucionado)

Publicado: 18 Dic 2010, 19:09
por taoru
hola a todos!, tanto tiempo que no pasaba por aqui, espero que todos anden bien!.
provando un poco con SQLite me surgieron algunas dudas:

con mi siguiente código creé una base de datos, creé la tabla, y le inserté campos.
hasta ahí voy bien, pero mi error o duda o problema está que solo me toma 1 resultado, no hay forma para q me levante mas resultados?, me puede tomar todos los valores de esa consulta, pero no varias filas de una consulta.

ejemplo:
en la tabla SQLite, cada mensaje le puse en el campo: data
el prefijo: msg

si yo busco con el query los msg, me tendría que aparecer todos los que hay, no solo el mensaje 1.
como podría levantar todos los mensajes, cual es mi error?.

y la duda es:
si quisiera poner una contraseña a esta base de datos para que solo sea leída por mi script y no por cualquiera, como puedo hacer esto en SQLite?, como se pone la contraseña?.

dejo aqui el código:

Código: Seleccionar todo

#include <SQLite.au3>
#include <SQLite.dll.au3>
#NoTrayIcon
; definimos variables:
Global $Query
Dim $aRow

; verificamos que haya cargado la librería de SQLite
_SQLite_Startup()
If @error > 0 Then
	MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
	Exit - 1
EndIf

; verificamos si existe la base de datos:
If FileExists('taoru.xdb') Then 
; Open database
$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb") 						

   Else
; Open database
$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb") 						

; creamos la tabla:
_SQLite_Exec(-1 , "CREATE TABLE tareas (Id NUMERIC, Data TEXT, tx TEXT);")

; insertamos campos:
_SQLite_Exec(-1 , "INSERT INTO tareas (Id,data,tx) VALUES ('1', 'msg', 'mensaje 1')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('2', 'msg', 'mensaje 2')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('3', 'languaje', 'autoit')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('4', 'msg', 'mensaje 3')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('5', 'languaje', 'php')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('6', 'msg', 'mensaje 4')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('7', 'msg', 'mensaje 5')")
   EndIf

; consultamos:
_SQlite_Query (-1, "SELECT tx FROM tareas Where Id>1", $Query)

_SQLite_FetchData ($Query, $aRow)
$num = UBound($aRow)
MsgBox(1, "cantidad de resultados", $num)
For $i = 1 to $num Step 1
MsgBox(1, "result " & $i & ":", $aRow[$i-1])
Next
gracias a todos, y que pasen felices fiestas!

Re: error en consultas SQLite y duda

Publicado: 18 Dic 2010, 19:12
por taoru
perdon, copié y tomé mal el query, copié otro script que estaba viendo que resultado tiraba.... el code es este:

Código: Seleccionar todo

#include <SQLite.au3>
#include <SQLite.dll.au3>
#NoTrayIcon
; definimos variables:
Global $Query
Dim $aRow

; verificamos que haya cargado la librería de SQLite
_SQLite_Startup()
If @error > 0 Then
	MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
	Exit - 1
EndIf

; verificamos si existe la base de datos:
If FileExists('taoru.xdb') Then 
; Open database
$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb") 						

   Else
; Open database
$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb") 						

; creamos la tabla:
_SQLite_Exec(-1 , "CREATE TABLE tareas (Id NUMERIC, Data TEXT, tx TEXT);")

; insertamos campos:
_SQLite_Exec(-1 , "INSERT INTO tareas (Id,data,tx) VALUES ('1', 'msg', 'mensaje 1')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('2', 'msg', 'mensaje 2')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('3', 'languaje', 'autoit')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('4', 'msg', 'mensaje 3')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('5', 'languaje', 'php')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('6', 'msg', 'mensaje 4')")
_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('7', 'msg', 'mensaje 5')")
   EndIf

; consultamos:
_SQlite_Query (-1, "SELECT tx FROM tareas Where data='msg'", $Query)

_SQLite_FetchData ($Query, $aRow)
$num = UBound($aRow)
MsgBox(1, "cantidad de resultados", $num)
For $i = 1 to $num Step 1
MsgBox(1, "result " & $i & ":", $aRow[$i-1])
Next
pueden observar en ambos casos que solo tira 1 solo resultado, no me toma todo el array de resultados de mensajes.

gracias

Re: error en consultas SQLite y duda

Publicado: 18 Dic 2010, 21:58
por Chefito
_SQLite_FetchData devuelve solamente un registro, por eso tienes que hacer un bucle donde condiciones que vaya leyendo los registro encontrados uno a uno hasta que se acaben. Te pongo el código corregidos de la forma que tu lo has hecho. Dentro de este código utilizo la función count en una consulta para que me devuelva el número de registros encontrados. Está algo comentado:

Código: Seleccionar todo

#include <SQLite.au3>
#include <SQLite.dll.au3>
#NoTrayIcon
; definimos variables:
Global $Query,$QueryNum,$aRow,$aRowNum,$cont=0

; verificamos que haya cargado la librería de SQLite
_SQLite_Startup()
If @error > 0 Then
   MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
   Exit - 1
EndIf

; verificamos si existe la base de datos:
If FileExists('taoru.xdb') Then
	; Open database
	$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb")

Else
	; Open database
	$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb")

	; creamos la tabla:
	_SQLite_Exec(-1 , "CREATE TABLE tareas (Id NUMERIC, Data TEXT, tx TEXT);")

	; insertamos campos:
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id,data,tx) VALUES ('1', 'msg', 'mensaje 1')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('2', 'msg', 'mensaje 2')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('3', 'languaje', 'autoit')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('4', 'msg', 'mensaje 3')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('5', 'languaje', 'php')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('6', 'msg', 'mensaje 4')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('7', 'msg', 'mensaje 5')")

EndIf

; consultamos:
_SQlite_Query (-1, "SELECT count(*) FROM tareas Where data='msg'", $QueryNum)	;consulta que te devuelve el número de registros que coincida con data='msg'
_SQLite_FetchData ($QueryNum, $aRowNum)
MsgBox(1, "cantidad de resultados", $aRowNum[0])
_SQLite_QueryFinalize($QueryNum)

_SQlite_Query (-1, "SELECT Id,tx FROM tareas Where data='msg'", $Query)	;consulta que te devuelve los registros que coincidan con el dato 'msg'. Muestra los campos Id y tx.
While _SQLite_FetchData ($Query, $aRow) = $SQLITE_OK ; Read Out the next Row
	$cont+=1
	MsgBox(1, "result " & $cont & ":", $aRow[1])
WEnd

_SQLite_QueryFinalize($Query)
_SQLite_Close ()
_SQLite_Shutdown ()
Te dejo otra forma de hacerlo, con _SQLite_GetTable para que veas la diferencia. Esta función es más rápida que la forma anterior pero consume algo más de memoria. Utiliza la que más te guste:

Código: Seleccionar todo

#include <SQLite.au3>
#include <SQLite.dll.au3>
#NoTrayIcon
; definimos variables:
Global $Query,$aRow, $aResult, $iRows, $iColumns,$iRval

; verificamos que haya cargado la librería de SQLite
_SQLite_Startup()
If @error > 0 Then
   MsgBox(16, "SQLite Error", "SQLite.dll Can't be Loaded!")
   Exit - 1
EndIf

; verificamos si existe la base de datos:
If FileExists('taoru.xdb') Then
	; Open database
	$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb")

Else
	; Open database
	$DataBase = _SQLite_Open (@ScriptDir & "\taoru.xdb")

	; creamos la tabla:
	_SQLite_Exec(-1 , "CREATE TABLE tareas (Id NUMERIC, Data TEXT, tx TEXT);")

	; insertamos campos:
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id,data,tx) VALUES ('1', 'msg', 'mensaje 1')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('2', 'msg', 'mensaje 2')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('3', 'languaje', 'autoit')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('4', 'msg', 'mensaje 3')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('5', 'languaje', 'php')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('6', 'msg', 'mensaje 4')")
	_SQLite_Exec(-1 , "INSERT INTO tareas (Id, data, tx) VALUES ('7', 'msg', 'mensaje 5')")
EndIf

; consultamos:
$iRval = _SQLite_GetTable (-1, "SELECT tx FROM tareas Where data='msg'", $aResult, $iRows, $iColumns)

$aResult[0]=$aResult[0]-1	;el elemento 0 nos da el número de registros encontrados en la consulta más los campos a mostrar, por eso le restamos uno (tx).
MsgBox(1, "cantidad de resultados", $aResult[0])
For $i = 1 to $aResult[0] Step 1
	MsgBox(1, "result " & $i & ":", $aResult[$i+1])
Next

_SQLite_Close ()
_SQLite_Shutdown ()
No he puesto condiciones para cuando las consultas no devuelvan ningún registro. Eso es muy facil. Te lo dejo a tí. Si no sabes hacerlo, mira en los ejemplos de la ayuda que ahí lo encontrarás :smt002 .

Menos mal que no se mucho de base de datos en AutoIt :smt005 .
Espero haberte ayudado.

Saludos.

Re: error en consultas SQLite y duda

Publicado: 19 Dic 2010, 02:06
por taoru
muchas gracias Chefito, si, quedó mas que claro!.

ahora solo quedaría saber como se le pone un usuario y password a las base de datos SQLite, se puede?.
así solo es leído por este script y nadie puede ver el contenido de la bd.
para q la bd tenga protejido su contenido.

gracias.

saludos!

Re: error en consultas SQLite y duda

Publicado: 19 Dic 2010, 03:04
por Chefito
Que yo sepa no se puede. Esta base de datos no tiene esta posibilidad. Hay una extensión de esta base con funciones para ser protegida, pero creo recordar que es de pago (http://www.hwaci.com/sw/sqlite/see.html).
Si quieres eso te tocará hacer cosas raras o trabajar con otra base de datos que ofrezca seguridad.

Saludos.

Re: error en consultas SQLite y duda

Publicado: 19 Dic 2010, 16:45
por taoru
gracias chefito!.

am, entonces si, tocará hacer cosa rara, jaja.

saludos y que pases felices fiestas!

Re: error en consultas SQLite y duda (solucionado)

Publicado: 19 Dic 2010, 17:37
por Chefito
taoru escribió:saludos y que pases felices fiestas!
Igualmente.

Hombre, una posibilidad podría ser encriptar el archivo con una contraseña. Inicialmente lo tendrías encriptado y cuando accedieses a ella lo desencriptas, acordandote siempre de volver a encriptarlo lo más rapidamente posible para que quede el menos tiempo desencriptado posible. Puedes desencriptarlo y trabajar con un temporar que luego sustituyes por el original con los cambios.
Logicamente no es una muy buena forma de protegerla, pero supongo que para los usuarios normales valdría.
Mira en la ayuda las funciones que empiezan por _Crypt_....... .

Otro problema sería el retardo al desencriptarla. Pienso que no hace falta una contraseña muy larga y un encriptamiento muy fuerte. También influirá el tamaño de la base.

Recuerda que siempre te queda utilizar otra base de datos, pero creo recordar que yo en su día hice una búsqueda de bases gratuítas de acceso local y no me gustaron los resultado. Pero inténtalo. Puede que tengas más éxito que yo. Y si encuentras algo interesante lo posteas.

Saludos.

Re: error en consultas SQLite y duda (solucionado)

Publicado: 06 Ene 2011, 13:35
por taoru
hola, mi aplicación es un gestor de mi sitio.
lo que hago con SQLite es guardar en base de datos local algunos datos para no tener que estar conectando a mysql online a cada ratito y así no sobrecargar el servidor.

mi consulta con el password es por si alguna de las pcs es infectado por troyanos podrían sacar datos confidenciales, o bien si en algún momento en el gestor pongo un jueguito para entretenernos que nadie pueda hacer trampa modificando la base de datos.

pensé en encriptar la bd, pero si en algún momento queda media pesadita haría mas lenta la maquina y tendría que guardar en algún lado la bd desencriptada aunque sea por unos instantes.

así que mi idea es:
* guardar textos de mensajes, o algunas cositas encriptadas, y poder desencriptarla solo cuando se la requiere.
y buscar alguna forma de guardar alguna clave secreta, así luego de desencriptar verifica si esa clave es correcta y así ya prevee que no fue alterado en el camino.

por ejemplo:
si guardo en bd los mensajes privados que se mandan entre los admins de mi sitio:

antes del mensaje podría guardar una clave por ejemplo: autoit, separada por un punto, entonces al enviar el mensaje quedaría así el texto:
autoit.texto del mensaje

luego la encripto con alguna contraseña.
cuando el destinatario la quiere leer tomo de la bd el mensaje, desencripto, y verifico si los primeros 7 caracteres corresponde a la clave: autoit.
y si es correcto muestro del caracter 8 en adelante.
eso en el caso de mensajes, en el caso de otros datos, un prosedimiento similar.

así la bd sería visible para cualquiera, pero con datos dificil de desifrar, y hasta donde yo se es muy complicado descompilar el ejecutable autoit, así que mientras la clave para desencriptar esté dentro del ejecutable, sería un prosedimiento bastante seguro.