Jump to content
Manimal

SQLite Básico

Recommended Posts

Olá a todos.

 

Para utilização do SQLite, dentro de uma aplicação desenvolvida em AutoIT, é muito simples. Tudo que precisamos fazer é:
  1. informar ao AutoIt que gerenciador utilizar (carregar a DLL do AutoIt)
  2. acessar o banco desejado
  3. fazer as operações necessárias
  4. fechar o banco e desativar a DLL
Infelizmente ao trabalhar com banco de dados a sintaxe SQL é obrigatória. Se vc não conhece os comandos básicos de SQL então não será possível trabalhar no SQLite. Nosso objetivo aqui é mostrar como utilizar o SQLite em conjunto com o AutoIt, portanto parte-se da premissa que pelo menos os comandos básicos de SQL já são conhecidos. Os comandos básicos incluem criação da estrutura das tabelas, manutenção dos dados (inclusão, alteração e exclusão) e recuperação das informações. Essa sintaxe SQL ou os comandos podem ser estudados na página do SQLite (http://sqlite.org/lang.html) ou quaisquer outras fontes na internet.
Minha recomendação é aprender pelo menos, os seguintes comandos:
Em relação à estrutura das tabelas (ou arquivos):
  • CREATE TABLE - criação de tabelas
  • ALTER TABLE - alteração da estrutura da tabela
  • DROP TABLE - exclusão de tabelas
Em relação às informações dentro das tabelas:
  • INSERT - insere informações
  • UPDATE - atualiza as informações
  • DELETE - deleta informações
Em relação a como recuperar as informações
  • SELECT - solicita os dados
A grande vantagem em aprender o básico de SQL é que todos os bancos de dados atuais no mercado seguem esta sintaxe, ou seja, independente de utilizar o SQLite ou Oracle, a sintaxe é basicamente a mesma, com pequenas variações próprias de cada banco. Portanto ao aprender SQL, estamos aprendendo a trabalhar com qualquer banco. Agora, vamos de volta ao SQLite com AutoIt.
Passo 1: informar ao AutoIt para usar o padrão SQLite pelo comando _SQLite_Startup.
Do manual:
#include <SQLite.au3>
_SQLite_Startup ( [$sDll_Filename = "" [, $bUTF8ErrorMsg = False [, $iForceLocal = 0 [, $hPrintCallback = $__g_hPrintCallback_SQLite]]]] )

Temos alguns parâmetros adicionais ao comando que DEVEM ser observados:

$sDll_Filename -> se não informada será usada o padrão sqlite3.dll ou sqlite3_x64.dll em sistemas de 64 bits. Se informada, o nome da DLL será procurado literalmente.
$iForceLocal -> se deve procurar a DLL especificada em outras pastas padrão do sistema como @ScriptDir, @SystemDir, @WindowsDir and @WorkingDir
Portanto se vc usar apenas o comando
_SQLite_Startup()

está dizendo ao AutoIt para abrir a DLL chamada SQLITE3.DLL que está obrigatoriamente na pasta do programa OU na pasta WINDOWS OU na pasta WINDOWS\SYSTEM32. Observe que se estiver em um ambiente de 64 bits, o arquivo a ser procurado automaticamente será o SQLITE3_X64.DLL.

Se quiser especificar uma DLL, informe o nome e caminho completo da mesma
_SQLite_Startup("C:\Pasta\NomeDoArquivo.DLL")

ou

_SQLite_Startup(@ScriptDir & "\NomeDoArquivo.DLL")

Atenção que o sufixo "_x64" é adicionado SEMPRE (independente do nome ser informado ou não) em caso de ambiente de 64 bits.

O retorno do comando identifica se realmente conseguiu carregar a DLL ou não.
Se conseguiu carregar, retorna o nome da DLL carregada
Se não conseguiu, seta @error e retorna uma string em branco ("")
Para obter as DLLs necessárias para poder trabalhar com AutoIt tem duas maneiras:
  1. pegar do repositório oficial do AutoIt em https://www.autoitscript.com/autoit3/pkgmgr/sqlite/
  2. pegar direto do fabricante SQLite em http://sqlite.org/download.html
Até a versão 3.3.14.1 do AutoIt, existia uma cópia da DLL em código de máquina dentro da pasta Include, bastando para ter acesso à SQLite que se fizesse uso do seguinte comando:
#include <SQLite.dll.au3>

Porém na versão 3.3.14.2 (última) este arquivo foi substituído por uma simples checagem de versão, cabendo ao programador procurar e baixar manualmente a DLL.

#FikaDika: Baixem também o SQLITE3.EXE, assim é possível "entrar" num ambiente do SQLite para testar os comandos e assim por diante. Ótimo para verificar se a sintaxe do comando SQL está correta, senão pode dar erro e não se sabe se é no SQLite ou no AutoIt.
Passo 2: acessar o banco desejado. Para isso utiliza-se o comando _SQLite_Open
Para abrir/criar um banco em disco:
_SQLite_Open("Nome e caminho completo do arquivo de banco de dados")

O retorno no comando é o handler (ou código) do banco aberto.

Se der erro, seta @error e o handler é zero!
A partir do momento que o banco está aberto, já estão disponíveis as operações
#FIkaDika: Notem que o SQLite tem uma característica muito interessante que é a criação e o uso de tabelas EM MEMÓRIA, ou seja, toda a estrutura é criada e mantida apenas na memória RAM (claro que foge ao princípio do armazenamento permanente), mas permite ao programador utilizar todo o poder do SQLite de forma extremamente veloz. Eu pessoalmente utilizo como alternativa melhorada dos arrays.
Para abrir/criar um banco em memória:
_SQLite_Open(":memory:")

ou simplesmente

_SQLite_Open()
Passo 3: fazer as operações desejadas
As operações são basicamente comandos a serem enviados ao SQLite informando o que desejamos fazer.
Neste ponto há a necessidade de conhecimento de linguagem SQL, pelo menos básico (já comentado).
Existem basicamente dois tipo de comandos:
  1. os comandos de consulta
  2. os demais comandos
Os comandos de consulta servem para recuperar as informações do banco de dados. Tem algumas variantes mas o principal é _SQLite_Query. Ao utilizar o _SQLite_Query o retorno acontece em um conjunto de dados que deve ser posteriormente lido e processado de acordo. Sua sintaxe é:
_SQLite_Query($hDB, $sSQL, ByRef $hQuery)

onde

$hDB é o handler do banco obtido através do _SQLite_Open
$sSQL é o comando SELECT necessário para solicitar os dados que precisamos
$hQuery é a variável que é passada por referência que vai conter o conjunto de dadso recuperados
Como dito antes, é necessário processar o conjunto de dados que foi gerado através da consulta. Para isso utilizamos o _SQLite_FetchData em um loop.
Local $Consulta, $Campo
_SQLite_Query($Handle_DB, "SELECT Nome,Telefone FROM Clientes ORDER BY Nome", $Consulta)
While _SQLite_FetchData($Consulta, $Campo) = $SQLITE_OK
   ConsoleWrite($Campo[0] & " - " & $Campo[1])
WEnd
Para esclarecer, os campos que são consultados no comando _SQLite_FetchData retornam em um array base 0 onde cada campo segue a sequência. Exemplos:
  • SELECT Nome,Telefone FROM Clientes
  • $Campo[0] é o Nome
  • $Campo[1] é o Telefone
SELECT Nome,Endereco,Telefone FROM Clientes
  • $Campo[0] é o Nome
  • $Campo[1] é o Endereco
  • $Campo[2] é o Telefone
SELECT Telefone,Nome FROM Clientes
  • $Campo[0] é o Endereco
  • $Campo[1] é o Nome
Os demais comandos são na verdade, comandos em sintaxe SQL que são enviados ao SQLite através do comando _SQLite_Exec. Se observarmos atentamente, veremos que o comando _SQLite_Query também é um comando SQL, porém a diferença é que neste caso, há um conjunto de informações a serem recuperados, ao passo que o _SQLite_Exec, por exemplo, retorna apenas se o comando foi ou não executado.
_SQLite_Exec($hDB, $sSQL [, $sCallBack = ""])

onde

$hDB é o handler do banco obtido através do _SQLite_Open
$sSQL é o comando SQL que queremos que seja executado
Se deu certo o comando retorna 0 (ou melhor a constante $SQLITE_OK)
Se não deu, retorna um código de erro. Este código pode ser comparado com as constantes do SQLite ou pode-se utilizar o comando _SQLite_ErrMsg para obter uma mensagem mais extensa (em inglês).
Exemplos:
Para criar uma tabela CLIENTES no banco de dados com 4 campos (codigo, nome, endereco e telefone)
_SQLite_Exec($Handle_DB, "CREATE TABLE Clientes (Codigo INTEGER, Nome TEXT, Endereco TEXT, Telefone TEXT);")

Para criar uma tabela CARROS com 2 campos (placa e chassi)

_SQLite_Exec($Handle_DB, "CREATE TABLE Carros (Placa TEXT, Chassi TEXT);")
Para incluir um carro na tabela CARROS
_SQLite_Exec($Handle_DB, "INSERT INTO Carros VALUES ('ABC1234','9BWHE21JX24060960');"
Para alterar um cliente na tabela CLIENTES (previamente criada)
_SQLite_Exec($Handle_DB, "UPDATE Clientes SET Endereco = 'RUA DOS ANZOIS, S/N' WHERE Codigo = 6");"
FikaDika: Atentar para o detalhe que TODOS os comandos que são passados para o SQL através do comando _SQLite_Exec PRECISAM ser terminados com ; (ponto e vírgula). Outro detalhe interessante sobre banco de dados é que 1 (UM) banco pode conter VÁRIAS tabelas internas, relacionadas ou não entre si. Cada tabela armazena um tipo de informação e são trabalhadas independente uma das outras.
FikaDika2: Ao criar as tabelas, pode-se utilizar a opção IF NOT EXISTS, dessa forma, a tabela será criada apenas uma vez, senão corremos o risco de APAGAR a tabela recriando-a ou simplesmente dar ERRO no comando porque a tabela ja existe!
CREATE TABLE IF NOT EXISTS Carros (Placa TEXT, Chassi TEXT)
Passo 4: fechar o banco de dados e desativar a DLL
Finalmente para fechar o banco e desativar a DLL os comandos são:
_SQLite_Close([$hDB = -1])
onde $hDB é o handler do banco obtido através do _SQLite_Open e
_SQLite_Shutdown()

que descarrega a DLL da memória (ou desativa)

Exemplo final prático:
#include <Sqlite.au3>

$SQLite_DLL = _SQLite_Startup()
ConsoleWrite("Utilizando " & StringUpper($SQLite_DLL) & " v" & _SQLite_LibVersion() & @CRLF)

Local $Handle_DB = _SQLite_Open()

_SQLite_Exec($Handle_DB, "CREATE TABLE Clientes (Codigo NUMERIC, Nome TEXT, Endereco TEXT, Telefone TEXT);")

_SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (1, 'Fulano de Tal',    'Rua das Flores, 123',     '(00) 1234-5678');")
_SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (2, 'Beltrano de Qual', 'Outra Rua Qualquer, s/n', '(00) 5678-1234');")
MOSTRA_CLIENTES()

_SQLite_Exec($Handle_DB, "UPDATE Clientes SET Endereco = 'RUA DOS ANZOIS, 100' WHERE Codigo = 2;")
MOSTRA_CLIENTES()

_SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (3, 'Mais um Maluco', 'Hospicio Geral, sl 2', '(00) 8274-5382');")
MOSTRA_CLIENTES()

_SQLite_Exec($Handle_DB, "DELETE FROM Clientes WHERE Codigo = 1;")
MOSTRA_CLIENTES()

_SQLite_Exec($Handle_DB, "DROP TABLE Clientes;")

_SQLite_Close($Handle_DB)
_SQLite_Shutdown()
Exit

Func MOSTRA_CLIENTES()
   Local $Consulta, $Informacao
   ConsoleWrite(@CRLF & "Lista de Clientes" & @CRLF)
   _SQLite_Query($Handle_DB, "SELECT Nome,Endereco,Telefone FROM Clientes ORDER BY Nome;", $Consulta)
   While _SQLite_FetchData($Consulta, $Informacao) == $SQLITE_OK
      ConsoleWrite("Nome: " & $Informacao[0] & " - Endereço: " & $Informacao[1] &  " - Telefone: " & $Informacao[2] & @CRLF)
   WEnd
EndFunc

Mesmo exemplo porém com tratamento de erros:

#include <Sqlite.au3>

Local $SQLite_DLL = _SQLite_Startup()
If $SQLite_DLL = "" Then
   ConsoleWrite("Erro ao carregar SQLITE.DLL" & @CRLF)
   Exit
EndIf
ConsoleWrite("Utilizando " & StringUpper($SQLite_DLL) & " v" & _SQLite_LibVersion() & @CRLF)

Local $Handle_DB = _SQLite_Open()
If $Handle_DB = 0 Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao abrir banco de dados" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf

If _SQLite_Exec($Handle_DB, "CREATE TABLE Clientes (Codigo NUMERIC, Nome TEXT, Endereco TEXT, Telefone TEXT);") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao abrir criar tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf

If _SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (1, 'Fulano de Tal',    'Rua das Flores, 123',     '(00) 1234-5678');") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao inserir na tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf
If _SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (2, 'Beltrano de Qual', 'Outra Rua Qualquer, s/n', '(00) 5678-1234');") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao inserir na tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf
MOSTRA_CLIENTES()

If _SQLite_Exec($Handle_DB, "UPDATE Clientes SET Endereco = 'RUA DOS ANZOIS, 100' WHERE Codigo = 2;") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao atualizar tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf
MOSTRA_CLIENTES()

If _SQLite_Exec($Handle_DB, "INSERT INTO Clientes VALUES (3, 'Mais um Maluco', 'Hospicio Geral, sl 2', '(00) 8274-5382');") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao inserir na tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf
MOSTRA_CLIENTES()

If _SQLite_Exec($Handle_DB, "DELETE FROM Clientes WHERE Codigo = 1;") <> $SQLITE_OK Then
   ConsoleWrite("Erro " & _SQLite_ErrCode() & " ao excluir da tabela CLIENTES" & @CRLF) ; verifique os erros dentro da Sqlite.au3
   Exit
EndIf
MOSTRA_CLIENTES()

_SQLite_Exec($Handle_DB, "DROP TABLE Clientes;")

_SQLite_Close($Handle_DB)
_SQLite_Shutdown()
Exit

Func MOSTRA_CLIENTES()
   Local $Consulta, $Informacao
   ConsoleWrite(@CRLF & "Lista de Clientes" & @CRLF)
   _SQLite_Query($Handle_DB, "SELECT Nome,Endereco,Telefone FROM Clientes ORDER BY Nome;", $Consulta)
   While _SQLite_FetchData($Consulta, $Informacao) == $SQLITE_OK
      ConsoleWrite("Nome: " & $Informacao[0] & " - Endereço: " & $Informacao[1] &  " - Telefone: " & $Informacao[2] & @CRLF)
   WEnd
EndFunc

O resultado dos exemplos acima deve ser:

Utilizando SQLITE3_X64.DLL v3.8.11.1

Lista de Clientes
Nome: Beltrano de Qual - Endereço: Outra Rua Qualquer, s/n - Telefone: (00) 5678-1234
Nome: Fulano de Tal - Endereço: Rua das Flores, 123 - Telefone: (00) 1234-5678

Lista de Clientes
Nome: Beltrano de Qual - Endereço: RUA DOS ANZOIS, 100 - Telefone: (00) 5678-1234
Nome: Fulano de Tal - Endereço: Rua das Flores, 123 - Telefone: (00) 1234-5678

Lista de Clientes
Nome: Beltrano de Qual - Endereço: RUA DOS ANZOIS, 100 - Telefone: (00) 5678-1234
Nome: Fulano de Tal - Endereço: Rua das Flores, 123 - Telefone: (00) 1234-5678
Nome: Mais um Maluco - Endereço: Hospicio Geral, sl 2 - Telefone: (00) 8274-5382

Lista de Clientes
Nome: Beltrano de Qual - Endereço: RUA DOS ANZOIS, 100 - Telefone: (00) 5678-1234
Nome: Mais um Maluco - Endereço: Hospicio Geral, sl 2 - Telefone: (00) 8274-5382
Edited by Manimal
  • Like 1

Share this post


Link to post
Share on other sites

qual seria o parametro para salvar o banco (criar o arquivo .bd)

 

editado: estava fazendo cagada aqui rs, agora já resolvi!

Edited by mutleey
  • Like 1

Share this post


Link to post
Share on other sites

Esqueci de mencionar uma técnica que eu uso ao fazer os SELECTs, para facilitar a legibilidade do script, que é a definição de constantes locais para acesso às informações.

 

No exemplo abaixo

Func MOSTRA_CLIENTES()
   Local $Consulta, $Campo
   ConsoleWrite(@CRLF & "Lista de Clientes" & @CRLF)
   _SQLite_Query($Handle_DB, "SELECT Nome,Endereco,Telefone FROM Clientes ORDER BY Nome;", $Consulta)
   While _SQLite_FetchData($Consulta, $Campo) == $SQLITE_OK
      ConsoleWrite("Nome: " & $Campo[0] & " - Endereço: " & $Campo[1] &  " - Telefone: " & $Campo[2] & @CRLF)
   WEnd
EndFunc

Observem que, como explicado anteriormente, o retorno do SELECT é armazenado na variável $Consulta e trabalhado através do array $Campos e seus índices:

SELECT Nome,Endereco,Telefone FROM Clientes ORDER BY Nome;
  • $Campo[0] é o Nome
  • $Campo[1] é o Endereco
  • $Campo[2] é o Telefone
Dessa forma, acho mais legível usar o comando ENUM para criar constantes locais assim:
Func MOSTRA_CLIENTES()
   Local $Consulta, $Campo
   Local Enum $DB_NOME, $DB_ENDERECO, $DB_TELEFONE
   ConsoleWrite(@CRLF & "Lista de Clientes" & @CRLF)
   _SQLite_Query($Handle_DB, "SELECT Nome,Endereco,Telefone FROM Clientes ORDER BY Nome;", $Consulta)
   While _SQLite_FetchData($Consulta, $Campo) == $SQLITE_OK
      ConsoleWrite("Nome: " & $Campo[$DB_NOME] & " - Endereço: " & $Campo[$DB_ENDERECO] &  " - Telefone: " & $Campo[$DB_TELEFONE] & @CRLF)
   WEnd
EndFunc

O resultado é o mesmo, mas eu acho que fica melhor para entendimento e manutenção posterior.
  • Like 1

Share this post


Link to post
Share on other sites

Modo coveiro [ON]

 

Criei um bd com o SQLite porem se eu abro o banco com o bloco de notas a maioria dos dados fica legivel.. será que fiz algo errado?

 

:dance:

Edited by mutleey

Share this post


Link to post
Share on other sites

Olá Mutleey.

 

Descupa mas seu post só apareceu hoje para mim.

 

Realmente se abrir o banco no BLoco de notas ou similar fica ilegível!

 

Para verificar, dar manutenção básica, testes, etc eu uso a ferramenta

 

http://sqlitebrowser.org/

 

Baixe o portable, simples e funcional!

Share this post


Link to post
Share on other sites

Manimal, obrigado pela resposta, mais no meu caso o banco que criei fica Legivel ou seja se abro com o bloco de notas ainda consigo ler alguns dados, claro que não fica organizado mais mesmo assim consigo ler alguns a dados.

 

vou criar um banco e postar como exemplo.

 

Edit: como exemplo aqui esta o banco que criei, não sei se fiz algo errado mais como da pra ver as informações ficam Legiveis.

SQLite format 3   @                                                                     -ñ¸
   « «                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                             StabledatasdatasCREATE TABLE datas (id,nome,endereco,numero,cpf,email,other)
   TT©                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                        Q+)+-2valdir de souzarua casa verde1164452.648.773.-14valdir@gmail.compendente  U+#)5'1carlos ferreirarua major 1134234.441.686-63carlosferr@gmail.comsaldo devedor
Edited by mutleey

Share this post


Link to post
Share on other sites

Oi Mutleey.

 

Legível é forma de dizer, pois alguma coisa sempre fica legível, não em formato direto, simples, editável, mas relativamente legível.

 

Não recomendo abrir o banco de dados em outra ferramenta porque pode (talvez) gravar algo em algum lugar que eventualmente possa dar pau depois (já aconteceu comigo)!

 

É como escrever um fonte do AutoIt no Word. Na hora de compilar dá erros por causa das formatações, mesmo que visualmente não tenha nenhuma, entendeu?

 

Mas afinal, o que vc quer fazer? Apenas ver o conteúdo do banco? Editar manualmente?

 

Com a ferramenta acima, vc pode fazer as duas coisas bem simples.

Share this post


Link to post
Share on other sites

Oi Mutleey.

 

Legível é forma de dizer, pois alguma coisa sempre fica legível, não em formato direto, simples, editável, mas relativamente legível.

 

Não recomendo abrir o banco de dados em outra ferramenta porque pode (talvez) gravar algo em algum lugar que eventualmente possa dar pau depois (já aconteceu comigo)!

 

É como escrever um fonte do AutoIt no Word. Na hora de compilar dá erros por causa das formatações, mesmo que visualmente não tenha nenhuma, entendeu?

 

Mas afinal, o que vc quer fazer? Apenas ver o conteúdo do banco? Editar manualmente?

 

Com a ferramenta acima, vc pode fazer as duas coisas bem simples.

 

Então Manimal.. minha duvida é que se eu fizer uma banco de dados para um programa de vendas ou alguma loja e quiser que os dados só seja acessado pelo tal programa de certa forma caso alguem queira pegar algum dado (celular ou cpf etc..) bastaria fazer uma copia do banco e abrir com o bloco de notas que muitos dos dados ficariam legiveis.

Edited by mutleey

Share this post


Link to post
Share on other sites

Oi Mutleey.

 

Ahh entendi... Bemvindo à programamção comercial!

 

Realmente, neste seu caso as informações ficariam "disponíveis" por assim dizer.

 

Mas vc não está sozinho nesta preocupação, tanto é que os bancos de dados maiores (MySQL, PostGres, Oracle, etc) tem todo o aparato de segurança necessário para evitar a visualização ou acesso dos dados por terceiros não autorizados, porém o SQLite não implementa este tipo de segurança.

 

O SQLite seria para montar bancos sem esse tipo de preocupação em mente, mas não siginifica que não possa ser utilizado, apenas que vc deve implementar uma camada extra de criptografia, a qual eu considero mais útil e mais simples do que migrar para um banco maior.

 

Claro que tudo isso depende muito mais do projeto que vc está tentanto desenvolver do que do banco em si.

 

Se a tua intenção é desenvolver um projeto comercial com informações relativamente confidenciais vc deveria considerar um banco de dados mais seguro, senão o SQLite resolve. É relativamente fácil de montar um framework de proteção no AutoIt / SQLite.

 

Mas para vc ter ideia, tem "trocentos" sistemas comerciais no mercado usando o Firebird, que eu considero um lixo muito inferior ao SQLite, e com as informações completamente abertas para quem quiser ver ou copiar. E os desenvolvedores não estão nem aí para essa questão.

 

Na prática, a possibilidade de alguém com conhecimento técnico suficiente para copiar ou "abrir" o banco é muito pequeno e destes quais realmente tem vontade ou necessidade de fazer isso?

 

No final, pese as possibilidades e veja a relação custo/benefíio para o teu projeto e mande bala!

 

E se vc está preocupado com segurança dos dados e vai desenvolver um sistema em AutoIt, já pensou na possibilidade de alguém descompilar teu sistema? Daí vc não perde só o banco...

  • Like 1

Share this post


Link to post
Share on other sites

Bom dia, existe o https://www.zetetic.net/sqlcipher/ ele criptografa os dados no SQLite, resumindo, se não tiver a senha, não abre.

 

Eu já vi um exemplo no fórum americano exatamente sobre isso.

 

Mas nesse ponto cai naquela velha questão, o AutoIt é facilmente descompilável.

 

Mas também tem aquela velha dúvida minha: você consegue descompilar "a3x"?

 

Ele compila o código AutoIt sem embutir o AutoIt no .exe, ele fica muito mais enxuto, e não roda se não tiver o .exe.

 

Algo do tipo: "AutoIt.exe meuscript.a3x".

 

Talvez não seja uma boa ideia colocar a senha do sqlite.db no executável, mas nem tudo está perdido, talvez (talvez... talvez... amarrado com o unique hardware id do sistema) em um "a3x".

 

Seria legal você testar e comentar, para mim, isso tudo é apenas teórico, mas com boas chances de funcionar.

 

Até mais.

  • Like 2

Share this post


Link to post
Share on other sites

Opa, eu lembro desse tópico, fica aqui minha sugestão: http://www.autoitscript.com/forum/index.php?app=core&module=attach&section=attach&attach_id=35687

 

A senha para ter acesso ao .db está aqui:

pragma key = 'Radu is happy!'

Teste com uma senha diferente.

;don't include sqlite.dll.au3
#include <SQLite.au3>
_SQLite_Startup("System.Data.SQLite.dll")
ConsoleWrite('Lib[' & _SQLite_LibVersion() & ']' & @LF)
ConsoleWrite('Open[' & _SQLite_Open("testcrypt.db") & ']' & @LF)
_SQLite_Exec(-1, "pragma key = 'Radu is happy!'; create table if not exists test (id integer, val text);" & _
        "insert into test values (1, 'abc');")
Local $row
_SQLite_QuerySingleRow(-1, "select * from test;", $row)
ConsoleWrite($row[1] & @LF)
_SQLite_Close()
_SQLite_Shutdown()
Edited by AutoItCoder
  • Like 1

Share this post


Link to post
Share on other sites

Estou tentando criar e ler um banco de dados e seguindo as instruções postadas aqui fiz testes mas fiquei parado logo no início pois dá uma mensagem de erro "Erro 21 ao abrir banco de dados",  pesquisei e ví que o código de erro 21 é  biblioteca incorreta mas não sei como corrigir isto pois baixei os arquivos do link indicado no tutorial e ao meu ver a versão da dll e data de modificação estão corretas, alguém sabe como resolver isto?

Share this post


Link to post
Share on other sites

Baixei a última versão 3.3.14.5 mas o erro persiste.

>Running:(3.3.14.5):C:\Arquivos de programas\AutoIt3\autoit3.exe "D:\Novo(a) AutoIt v3 Script.au3"    
+>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
Utilizando D:\SQLITE3_302700200.DLL v0
Erro 21 ao abrir banco de dados

 

Share this post


Link to post
Share on other sites

Encontrei um exemplo no forum americano que está funcionando e vou fazer testes com ele.

#include <GUIConstants.au3>
#include <EditConstants.au3>

;~ #include <SQLite.au3>
;~ #include <SQLite.dll.au3>

#include "SQLite.au3"
#include "SQLite.dll.au3"

$form_num = 1

#Region ### START Koda GUI section ### Form=
$Form1 = GUICreate("Sqlite GUI test", 223, 359, 267, 119)
$count = GUICtrlCreateInput($form_num, 144, 10, 33, 21, BitOR($ES_AUTOHSCROLL,$ES_READONLY))
$b_right = GUICtrlCreateButton(">", 176, 8, 27, 25, 0)
$b_left = GUICtrlCreateButton("<", 120, 8, 27, 25, 0)
$lname = GUICtrlCreateLabel("Name:", 8, 48, 48, 17)
$iname = GUICtrlCreateInput("", 64, 48, 145, 21)
$ladress = GUICtrlCreateLabel("Adress:", 8, 88, 45, 17)
$iadress = GUICtrlCreateInput("", 64, 88, 145, 21)
$iemail = GUICtrlCreateInput("", 64, 128, 145, 21)
$lemail = GUICtrlCreateLabel("E-mail:", 8, 128, 46, 17)
$lother = GUICtrlCreateLabel("Other:", 8, 168, 46, 17)
$eother = GUICtrlCreateEdit("", 64, 168, 145, 121)
$badd = GUICtrlCreateButton("Add", 48, 312, 75, 25, 0)
$bdel = GUICtrlCreateButton("Delete", 128, 312, 75, 25, 0)
GUISetState(@SW_SHOW)
#EndRegion ### END Koda GUI section ###

_SQLite_Startup()
If NOT FileExists("database.db") Then
    $dbn=_SQLite_Open("database.db")
    _SQLite_Exec($dbn,"CREATE TABLE datas (id,name,adress,email,other);")
Else
    $dbn=_SQLite_Open("database.db")
EndIf


MsgBox(4096, '', $dbn)

dataquery($form_num)

While 1
    $nMsg = GUIGetMsg()
    Switch $nMsg
        Case $GUI_EVENT_CLOSE
            progend()
        Case $b_right
            $form_num = $form_num + 1
            GUICtrlSetData($count,$form_num)
            dataquery($form_num)
        Case $b_left
            If $form_num == 1 Then
                $form_num = 1
                GUICtrlSetData($count,$form_num)
            Else
                $form_num = $form_num - 1
                GUICtrlSetData($count,$form_num)
                dataquery($form_num)
            EndIf
        Case $badd
            IF GUICtrlRead($iname) == "" Then
                MsgBox(0,"ERORR","Empty name!")
            Else
                dataadd($form_num)
            EndIf
        Case $bdel
            datadel($form_num)
    EndSwitch
WEnd

Func progend()
    _SQLite_Close()
    _SQLite_Shutdown()
    Exit
EndFunc

Func dataadd($id)
    Local $retarr
    $str1 = GUICtrlRead($iname)
    $str2 = GUICtrlRead($iadress)
    $str3 = GUICtrlRead($iemail)
    $str4 = GUICtrlRead($eother)
    _SQLite_QuerySingleRow($dbn,"SELECT id FROM datas WHERE id='"&$id&"'",$retarr)
    If $retarr[0] <> "" Then
        _SQLite_Exec($dbn,"UPDATE datas SET name='"&$str1&"', adress='"&$str2&"',email='"&$str3&"',other='"&$str4&"' WHERE id='"&$id&"'")
    Else
        _SQLite_Exec($dbn,"INSERT INTO datas (id,name,adress,email,other) VALUES ('"&$form_num&"','"&$str1&"','"&$str2&"','"&$str3&"','"&$str4&"');")
    EndIf
EndFunc


Func dataquery($id)
    GUICtrlSetData($iname,"")
    GUICtrlSetData($iadress,"")
    GUICtrlSetData($iemail,"")
    GUICtrlSetData($eother,"")
    Local $retarr
    If _SQLite_QuerySingleRow($dbn,"SELECT * FROM datas WHERE id='"&$id&"'",$retarr) == $SQLITE_OK Then
        If $retarr[0] == "" Then
            ;MsgBox(0,"ERROR","Query error!")
        Else
            GUICtrlSetData($iname,$retarr[1])
            GUICtrlSetData($iadress,$retarr[2])
            GUICtrlSetData($iemail,$retarr[3])
            GUICtrlSetData($eother,$retarr[4])
        EndIf
    EndIf
EndFunc

Func datadel($id)
    Local $retarr
    GUICtrlSetData($iname,"")
    GUICtrlSetData($iadress,"")
    GUICtrlSetData($iemail,"")
    GUICtrlSetData($eother,"")
    _SQLite_QuerySingleRow($dbn,"SELECT id FROM datas WHERE id='"&$id&"'",$retarr)
    If $retarr[0] <> "" Then
        _SQLite_Exec($dbn,"DELETE FROM datas WHERE id='"&$id&"'")
    EndIf
EndFunc

 

Share this post


Link to post
Share on other sites

@Belini

   Não entendi a questão de não conseguir abrir o banco de dados. Como assim?

   Preste atenção que um arquivo de banco de dados no SQLite (ou outro bando de dados) não é como um arquivo convencional!

   A melhor analogia que podemos utilizar é que o "arquivo físico do banco de dados" é como se fosse um arquivo tipo ZIP, por exemplo.

   Como arquivo ele é inútil, mas dentro dele é que tem os arquivos que precisamos.

   Da mesma forma funciona um arquivo de banco de dados. Ao criarmos um arquivo "físico" não podemos simplesmente sair utilizando o mesmo, como se fosse um arquivo TXT.

   É necessário criar as TABELAS dentro do arquivo. Daí finalmente, pode-se incluir, alterar, deletar ou consultar os dados.

   A maioria das pessoas (eu inclusive) quando comecei com banco de dados, não sabia disso. Tinha uma noção, mas só na prática que fui entender corretamente o SQLite. Hoje não abro mais mão de trabalhar com ele.

 

   Finalmente, pela mensagem de erro que vc postou antes:

On 14/01/2020 at 12:33 PM, Belini said:

Baixei a última versão 3.3.14.5 mas o erro persiste.

>Running:(3.3.14.5):C:\Arquivos de programas\AutoIt3\autoit3.exe "D:\Novo(a) AutoIt v3 Script.au3"    
+>Setting Hotkeys...--> Press Ctrl+Alt+Break to Restart or Ctrl+BREAK to Stop.
Utilizando D:\SQLITE3_302700200.DLL v0
Erro 21 ao abrir banco de dados

 

   Eu diria que com 99% de certeza que vc está utilizando a DLL errada para o ambiente que vc está trabalhando.

   O comando de inicialização do SQLite - comando _SQLite_Startup() - é um saco de trabalhar porque ele é pouco intuitivo. Quando dá erro, todas as operações subsequentes não funcionam.

   No seu caso, a primeira coisa a identificar é o ambiente! É 32 ou 64 bits? E se vc está forçando seu script a trabalhar em qual ambiente?

  Segunda coisa: os parâmetros do _SQLite_Startup(). Tem duas situações:

      1) se não passar nenhum nome como parâmetro ele assume obrigatoriamente os nomes

         SQLITE3.DLL para ambiente 32 bits e

         SQLITE3_X64.DLL para ambiente 64 bits

         quaisquer outros nomes NÃO FUNCIONAM! Dá erro e não inicializa o SqLite! Que acaba dando a msg que vc postou!

         Outra coisa muito importante, estes arquivos DEVEM estar preferencialmente na mesma pasta do script. A sequência de procura das DLLs é @ScriptDir, @SystemDir, @WindowsDir e @WorkingDir. Quando não acha na pasta do script, vai na pasta @systemdir, depois @windowsdir e finalmente na @workingdir. E novamente os nomes são obrigatoriamente os descritos acima!

   2) se passar o nome da DLL a ser aberta e o ambiente for 64 bits, o próprio AutoIt vai acrescentar o sufixo _X64 em qualquer nome que for passado! Isto é um pseudo-bug do AutoIt!

      Exemplo:   _SQLite_Startup("F:\MeuArquivo.Dll")

      Neste caso, se o ambiente for 32 bits e o arquivo "MeuArquivo.Dll" existir no drive F: a SQLite será inicializada.

      MAS se for ambiente 64 bits, o sufixo _X64 será incluído automaticamente (pseudo-bug do AutoIt) e o arquivo a ser procurado será o MeuArquivo_X64.Dll, ocasionando um erro porque o arquivo especificado como argumento não existe (ou não foi encontrado). Acredito que este seja o motivo do erro no seu caso.

   Apesar disto tudo estar escrito no 1o post, acho que não ficou bem claro! Falha minha. Peço desculpas por isso!

 

   E por último, quando falamos em forçar o ambiente (32 ou 64 bits) é muito importante que isto esteja bem claro desde o começo em nossos scripts, pois gera uma fonte interminável de dores de cabeça. Independente do ambiente que vc trabalha (não confundir com o ambiente onde vai executar o script depois de pronto), é muito esclarecedor para o script (e para nós mesmos) que tenhamos certeza de onde estamos pisando!

   Eu pessoalmente utilizo a diretriz

#AutoIt3Wrapper_UseX64=n

   Para informar ao AutoIt qual é o meu ambiente de desenvolvimento. Sempre em 32 bits!

   Assim, eu garanto que, se eu compilar para teste ou compilar final meu script sempre vai rodar em 32 bits em qualquer ambiente (32 ou 64), e por tabela as DLL associadas também devem ser em 32 bits. Isto interfere um monte no ambiente que está sendo executado, como na macro @ProgramFiles, que pode ser

   C:\Program Files

   ou

   C:\Program Files (x86)

ou DLLs a serem carregadas,. Até mesmo a pasta do sistema @SystemDir é afetada, pois pode ser tanto

   C:\Windows\System32

ou

   C:\Windows\SysWOW64

   Então se o seu script vai rodar em 32 ou 64 bits, tenha certeza que fazer as modificações adequadas no código para evitar confusão depois! Utilize a macro @AutoItX64 par garantir isso.

   Depois que eu percebi este detalhe e passei a controlar o ambiente, e não deixar por conta, tive trocentos problemas a menos com DLLs e arquivos.

   Por exemplo, ao procurar por atualização de um arquivo no servidor, sendo que o seu script diferencia o ambiente:

Local $sArquivo = "MeuArquivo.Dll"
If @AutoItX64 Then $sArquivo = "MeuArquivo64.Dll"
If not BAIXAR_ARQUIVO($sArquivo) Then ConsoleWrite('Erro" & @CRLF)

   Boa sorte!

Share this post


Link to post
Share on other sites

@manimal o problema não era o ambiente e sim o nome da dll, agora seu exemplo funcionou perfeitamente agora preciso apenas acessar o banco de dados com o se os dados das colunas estivessem gravados em um arquivo ini, vou postar esta dúvida no outro tópico que criei para ver se vc consegue ajudar.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


×