SQLITE 3 - Básico em Harbour

Fórum sobre Banco de Dados e RDDs para Clipper/[x]Harbour.

Moderador: Moderadores

Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour

Mensagem por susviela@bol.com.br »

Bom gente, esse tópico eu estou criando para contribuir com o povo, que assim como eu está (re)iniciando xBase; Vou tentar contribuir também.

Passo um, solucionado os problemas de compilação, a nova etapa do meu aprendizado é habitar o uso desse excelente banco de dados. Para minha surpresa o Harbour embarcou o SGBD no executável criado, isso é uma maravilha, pensem bem, só um EXE e o sistema está funcionando no cliente.
Claro que isso tem implicações do tipo, se sair uma versão mais atual, por exemplo a 4.0 do SQLITE, teríamos que rever esse recurso, mas a princípio está ótimo no momento em que escrevo esse texto (Jul/2017).

No exemplo abaixo já é possível:
1) CRIAR O BANCO DE DADOS
2) CRIAR AS TABELAS DO BANCO DE DADOS

Código: Selecionar todos

#require "hbsqlit3"

PROCEDURE Main()
 
 LOCAL db := sqlite3_open( "dados.db", .T. )   // .T.  = criar banco se não existir
 
 LOCAL tabcliente := "CREATE TABLE cliente( " +;
                                 " idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
				 " nome CHAR(100), "+;
				 " idade INTEGER, "+;
				 " dtnascimento DATE ); "

 LOCAL tabusuario := "CREATE TABLE usuario( " +;
                                 " idusuario INTEGER PRIMARY KEY AUTOINCREMENT, " +;
			         " nome CHAR(100), "+;
				 " senha CHAR(15), "+;
				 " nivel INTEGER NOT NULL DEFAULT (1) ); "
					 
    IF sqlite3_exec( db, tabcliente ) == SQLITE_OK
         ? " Tabela clientes criada com sucesso..." 
    ENDIF


    IF sqlite3_exec( db, tabusuario ) == SQLITE_OK
         ? " Tabela usuario criada com sucesso..." 
	ENDIF

	sqlite3_sleep( 3000 )

RETURN
   
Após rodar o sistema o banco é criado e depois são criadas as tabelas, fiz testes e está funcionando bem. Vou tentar manter esse tópico com mais atualizações, espero que possa ser útil para algum colega.

Quem quiser pode usar o excelente gerenciador do SGBD SQLITE o SQLiteStudio, ele é free e pode ser baixado em: ( https://sqlitestudio.pl/index.rvt)
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour (ADD)

Mensagem por susviela@bol.com.br »

Nesse segundo passo adicionamos dados a tabela de usuários já criada no passo anterior, mesmo assim vou incluir o fonte completo.

Código: Selecionar todos

#require "hbsqlit3"

PROCEDURE Main()
 
 LOCAL db := sqlite3_open( "novodb.db", .T. )   // .T.  = criar banco se não existir
 Local sql := ""
 
 LOCAL tabcliente := "CREATE TABLE cliente( " +;
                     " idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
					 " nome CHAR(100), "+;
					 " idade INTEGER, "+;
					 " dtnascimento DATE ); "

 LOCAL tabusuario := "CREATE TABLE usuario( " +;
                     " idusuario INTEGER PRIMARY KEY AUTOINCREMENT, " +;
					 " nome CHAR(100), "+;
					 " senha CHAR(15), "+;
					 " nivel INTEGER NOT NULL DEFAULT (1) ); "
					 
    IF sqlite3_exec( db, tabcliente ) == SQLITE_OK
         ? " Tabela clientes criada com sucesso..." 
	ENDIF


    IF sqlite3_exec( db, tabusuario ) == SQLITE_OK
         ? " Tabela usuario criada com sucesso..." 
	ENDIF

	// vamos adicionar dados ao banco
	
	sql := CrudAdd()
	
    IF sqlite3_exec( db, sql ) == SQLITE_OK
        ? " Novos usuarios cadastrados..." 

	? "Numero Linhas incluídas: " + hb_ntos( sqlite3_changes( db ) )
	? "Total Alterações: " + hb_ntos( sqlite3_total_changes( db ) )
		
	ELSE	
		? "Erro: ao gravar novos usuários"
	ENDIF	
	
		
	sqlite3_sleep( 6000 )
	

RETURN


Function CrudAdd(sql)
	sql := " " + ;     
	"BEGIN TRANSACTION;" + ;
         "INSERT INTO usuario ( nome, senha , nivel ) VALUES( 'Carlos', '999999', 3 );" + ;
         "INSERT INTO usuario ( nome, senha ) VALUES( 'Jose', '123' );" + ;
         "INSERT INTO usuario ( nome, senha ) VALUES( 'Simone', '123' );" + ;
         "INSERT INTO usuario ( nome, senha ) VALUES( 'Zeca', '123' ); " + ;
	"COMMIT;" 

RETURN (sql)
   
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour - New

Mensagem por susviela@bol.com.br »

Ano passado comecei esse tutorial e acabei não continuando o desenvolvimento do mesmo.

Agora motivado novamente vou concluir esse tutorial, para isso estou criando uma Classe que tem por objetivo ser um CRUD em SQLite;

Esse tutorial estou publicando no meu BLOG, espero a visita de vocês lá também:

https://programandoxbase.wordpress.com/ ... -classe-i/

==========================

Código: Selecionar todos

#include <hmg.ch>
#include "hbclass.ch"
#require "hbsqlit3"

CREATE CLASS tCliente 
	DATA   ccBancoDados INIT "dados.db"
	DATA   ccTabela 	INIT "cliente"
	DATA   ccDB			INIT NIL	
	
	//  todas colunas da tabela 
	DATA   idcliente 	INIT 0
	DATA   nome 		INIT ""
	DATA   idade 		INIT 0
	DATA   dtnascimento	INIT CTOD("0001/01/01")
	
	METHOD New(cArqDB) 	CONSTRUCTOR
	METHOD CriarTabela()
	METHOD Inserir()

ENDCLASS

*---------------------------------------------------------------------------
METHOD New(cArqDB) CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL retdb

	cArqDB := IF( Empty( cArqDB ), ::ccBancoDados, cArqDB )
	
	retdb := sqlite3_open( cArqDB, .T. )   			// .T.  = criar se não existir
	
	IF Empty( retdb )
	
		MsgInfo("Não foi possível criar banco de dados: " + ::ccBancoDados)
		Return NIL

	ENDIF
	
	::ccDB := retdb
	
	::CriarTabela()                                       //self executa metodo CriarTabela dessa classe
	
Return Self    // construtor retorna self

*---------------------------------------------------------------------------
METHOD CriarTabela() CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL cSql := 	"CREATE TABLE IF NOT EXISTS "+ ::ccTabela +"( " +;
				" idcliente INTEGER PRIMARY KEY AUTOINCREMENT, " +;
				" nome CHAR(100), "+;
				" idade INTEGER, "+;
				" dtnascimento DATE ); "

	sqlite3_exec( ::ccDB, cSql ) 
 
	IF sqlite3_errcode( ::ccDB ) > 0                     // error  executar SQL
	
	   MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
	   Return .f.

	ENDIF

Return Nil

*---------------------------------------------------------------------------
METHOD Inserir() CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL retdb
	LOCAL cSql :=""
	LOCAL dt_nascimento := DTOS( ::dtnascimento )
	       
	dt_nascimento :=SUBSTR(dt_nascimento,1,4)+ "-"+;
					SUBSTR(dt_nascimento,5,2)+ "-"+;
					SUBSTR(dt_nascimento,7,2)       	 //ajusta data aaaa-mm-dd (efeito colateral SET DATE)
		 	 
	cSql := "INSERT INTO "+ ::ccTabela +"(  " +;
			" nome , idade, dtnascimento )  " +;
			"VALUES ( " +;
			"'" + ::nome  				+"', "+;
			" " + AllTrim(Str(::idade))	+" , "+;
			"'" + dt_nascimento 		+"'); "
			

	sqlite3_exec( ::ccDB, cSql ) 
 
	IF sqlite3_errcode( ::ccDB ) > 0                     // error  executar SQL
	
	   MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
	   Return .f.
	   
	ENDIF
	
Return .T.

Continua ....
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour - New

Mensagem por susviela@bol.com.br »

No post anterior ( Harbour: SQLite - Classe II ), adicionamos a nossa classe o método Inserir(), agora vamos implementar nessa mesma classe mais um método que vai nos permitir LISTAR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.

https://programandoxbase.wordpress.com/ ... classe-iii

Código: Selecionar todos

*---------------------------------------------------------------------------
METHOD Listar( cComplemento ) CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL cSql, cRet
	LOCAL aDados := {}
	
	cComplemento := IF(cComplemento == Nil, "", cComplemento)
	
	cSql := "SELECT * FROM "+ ::ccTabela +" " + cComplemento 

	cRet := sqlite3_prepare( ::ccDB, cSql )


	
	DO WHILE sqlite3_step( cRet ) == 100               // SQLITE_ROW 100 tem outra linha pronta 
	
		aLinha := {}
		
		AADD( aLinha, sqlite3_column_int( cRet, 1 ) )    	// idcliente
		AADD( aLinha, sqlite3_column_text( cRet, 2 ) )    // Nome
		AADD( aLinha, sqlite3_column_int( cRet, 3 ) )   	// Idade
		AADD( aLinha, sqlite3_column_text( cRet, 4 ) )    // dtnascimento

		AADD(aDados, aLinha)

		
	ENDDO
	
	sqlite3_clear_bindings( cRet )
	sqlite3_finalize( cRet )	
	
Return ( aDados )

Exemplo de utilização do método:

Código: Selecionar todos

	alista := {}
	
	alista := oCliente:Listar()
			
	msginfo( Len(alista) )   // total itens listados
	msginfo( alista[1] )  // linha UM completa
	msginfo( alista[1][2] ) // linha UM item DOIS (nome) 

Lá no blog coloquei uma explicação mais detalhada para quem esta começando.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour - NEW

Mensagem por susviela@bol.com.br »

No post anterior ( Harbour: SQLite – Classe III ), adicionamos a nossa classe o método Listar(), agora vamos implementar nessa mesma classe mais um método que vai nos permitir ATUALIZAR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.

https://programandoxbase.wordpress.com/ ... classe-iv/

Código: Selecionar todos

*---------------------------------------------------------------------------
METHOD Atualizar( nIDcliente ) CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL retdb
	LOCAL cSql :=""
	LOCAL dt_nascimento := DTOS( ::dtnascimento )

	IF (nIDcliente == Nil .OR. nIDcliente = 0 )
	
		Msginfo("ID cliente inválida")
		Return .F.
	
	ENDIF
	
	dt_nascimento :=SUBSTR(dt_nascimento,1,4)+ "-"+;
					SUBSTR(dt_nascimento,5,2)+ "-"+;
					SUBSTR(dt_nascimento,7,2)       	 //ajusta data aaaa-mm-dd
		 	 
	cSql := " UPDATE "+ ::ccTabela +" SET  " +;
			" nome = '" + ::nome   				+"', "+;
			" idade = " + AllTrim(Str(::idade))	+" , "+;
			" dtnascimento ='" + dt_nascimento 	+"' " +;
			" WHERE idcliente = " + AllTrim(Str(nIDcliente)) + " ;"
			

	sqlite3_exec( ::ccDB, cSql ) 
 
	IF sqlite3_errcode( ::ccDB ) > 0                     // error  executar SQL
	
	   MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
	   Return .f.
	   
	ENDIF
	
Return .T.


Como usar esse método:

Código: Selecionar todos

	oCliente:= tCliente():New()                 // instancia a classe

	
	oCliente:nome := "Cliente da Silva Sauro"     // envia valores p/ classe
	oCliente:idade := 37
	oCliente:dtnascimento := CTOD("09/09/2000")

	nIDcli := 3
	
	ret = oCliente:Atualizar(nIDcli)                  // chama método com parâmetro 3
	
	IF (ret == .T. )
		msg := "Registro: " + STR(nIDcli) + " Atualizado com sucesso."
	ELSE
		msg := "Registro: " + STR(nIDcli) + " Não atualizado/localizado. "
	ENDIF
	
	MsgInfo( msg )
	
	
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour - NEW -CRUD SQLite

Mensagem por susviela@bol.com.br »

No post anterior ( Harbour: SQLite – Classe IV ), adicionamos a nossa classe o método Atualizar(), o Update do Crud SQLite, agora vamos implementar nessa mesma classe mais um método que vai nos permitir EXCLUIR dados da tabela, caminhamos assim em direção a conclusão do nosso CRUD SQLite em xBase/Harbour.

https://programandoxbase.wordpress.com/ ... -classe-v/

Código: Selecionar todos

*---------------------------------------------------------------------------
METHOD Excluir( nIDcliente ) CLASS tCliente
*---------------------------------------------------------------------------
	LOCAL retdb
	LOCAL cSql :=""

	IF (nIDcliente == Nil .OR. nIDcliente = 0 )
	
		Msginfo("ID cliente inválida")
		Return .F.
	
	ENDIF
	
	cSql := " DEL FROM "+ ::ccTabela +;
			" WHERE idcliente = " + AllTrim(Str(nIDcliente)) + " ;"			

	sqlite3_exec( ::ccDB, cSql ) 
 
	IF sqlite3_errcode( ::ccDB ) > 0                     // error  executar SQL
	
	   MsgStop( sqlite3_errmsg(::ccDB ) +" SQL : " + cSql)
	   Return .f.
	   
	ENDIF
	
Return .T.

Como usar o método criado:

Código: Selecionar todos

Function main

	oCliente:= tCliente():New()                 // instancia a classe

	nIDcli := 7
	
	ret = oCliente:Excluir(nIDcli)                  // chama método com parâmetro 3
	
	IF (ret == .T. )
		msg := "Registro: " + STR(nIDcli) + " Excluído com sucesso."
	ELSE
		msg := "Registro: " + STR(nIDcli) + " Não foi Excluído/Localizado. "
	ENDIF
	
	MsgInfo( msg )
	
Return .T.

Conclusão:

Com a conclusão, nem de longe esse tutorial tem a pretensão de esgotar o tema, mas, pretende servir como base de conhecimento para quem deseja usar xBase, Harbour, SQLite, e serve como um incentivo para quem quer aprofundar-se em PPO xBase (Programação Orientada a Objetos ) e reaproveitar os códigos desenvolvidos no nosso bom e velho Clipper.
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

SQLITE 3 - Básico em Harbour

Mensagem por HASA »

:)) :D
Boa tarde, Susviela ainda utilizo DBF estou querendo migrar a tempos para um banco mais rápido e confiável ( claro ), o que gostei desse exemplo é saber que o Harbour embarcou o SGBD no executável criado, sempre foi meu dilema pois uso DBF que crio e atualizo campos sem problemas, acredito que pelo que estou vendo posso criar o banco de dados e no futuro precisando atualizar facilmente inserir novos campos na base de dados? Por exemplo a NF-e 4.0 criou novos campos que teremos que gravar em nosso BD´s crio e atualizo em DBF com "o pé nas costas" com esse SQLite posso fazer isso também?

Parabens por mais essa força,

:-Y

HASA
Avatar do usuário
susviela@bol.com.br
Usuário Nível 3
Usuário Nível 3
Mensagens: 236
Registrado em: 30 Jun 2017 11:17
Localização: São José / SC
Contato:

SQLITE 3 - Básico em Harbour

Mensagem por susviela@bol.com.br »

HASA escreveu::)) :D
Boa tarde, Susviela ainda utilizo DBF estou querendo migrar a tempos para um banco mais rápido e confiável ( claro ), o que gostei desse exemplo é saber que o Harbour embarcou o SGBD no executável criado, sempre foi meu dilema pois uso DBF que crio e atualizo campos sem problemas, acredito que pelo que estou vendo posso criar o banco de dados e no futuro precisando atualizar facilmente inserir novos campos na base de dados? Por exemplo a NF-e 4.0 criou novos campos que teremos que gravar em nosso BD´s crio e atualizo em DBF com "o pé nas costas" com esse SQLite posso fazer isso também?

Parabens por mais essa força,

:-Y

HASA
Um SQL Básico já resolveria

Incluir uma coluna:
ALTER TABLE cliente ADD COLUMN sexo char(1);

Mudar nome tabela:
ALTER TABLE cliente RENAME TO tbCliente;


Assim que tiver um tempinho vou publicar lá no blog uns exemplos SQLite.

https://programandoxbase.wordpress.com/
.
.
"E quando você perder o controle, colherá o que plantou."
=========================================
Carlos Alberto Nunes #Susviela
Site: https://www.PowerInformatica.com.br
=========================================
Blog xBase: https://programandoxbase.wordpress.com/
Blog TI: https://susviela.wordpress.com

( #ProgramandoxBase #AllxBase )
Avatar do usuário
HASA
Colaborador
Colaborador
Mensagens: 1088
Registrado em: 01 Set 2003 19:50
Localização: São Paulo
Contato:

SQLITE 3 - Básico em Harbour

Mensagem por HASA »

:)) :)) :)) :{
Combinado, vou acompanhar,
:-Y
HASA
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SQLITE 3 - Básico em Harbour

Mensagem por asimoes »

Obrigado pela contribuição

No HBP ou HBC quais libs devo incluir, tem um exemplo de uso para compilar?
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Marcos Kieron
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 14 Jan 2020 10:29
Localização: São Paulo/SP

SQLITE 3 - Básico em Harbour

Mensagem por Marcos Kieron »

Dá para usar com SQLMIX também, apenas para saber, mas não vou mencionar nada sobre isso aqui para não atrapalhar o tópico e confundir o pessoal, esse método acima é muito efetivo e rápido.
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SQLITE 3 - Básico em Harbour

Mensagem por asimoes »

na compilação dá esse erro:

hbmk2: Error: Referenced, missing, but unrecognized Harbour function(s):
SQLITE3_PROFILE(), SQLITE3_TRACE()

No hbmk.hbm está incluindo a lib hbsqlit3.hbc
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
asimoes
Colaborador
Colaborador
Mensagens: 4919
Registrado em: 26 Abr 2007 16:48
Localização: RIO DE JANEIRO-RJ

SQLITE 3 - Básico em Harbour

Mensagem por asimoes »

Descobri no ChangeLog, harbour 3.4

2016-08-30 20:28 UTC+0200 Viktor Szakats (vszakats users.noreply.github.com)
* contrib/hbsqlit3/core.c
* contrib/hbsqlit3/hbsqlit3.hbx
* deprecate SQLITE3_TRACE() and SQLITE3_PROFILE()
* add TODO to implement wrapper logic for replacement function

Isso significa que o demo do harbour não foi modifcado, está usando estas 2 funções obsoletas
►Harbour 3.x | Minigui xx-x | HwGui◄
Pense nas possibilidades abstraia as dificuldades.
Não corrigir nossas falhas é o mesmo que cometer novos erros.
A imaginação é mais importante que o conhecimento. (Albert Einstein)
Avatar do usuário
alaminojunior
Colaborador
Colaborador
Mensagens: 1717
Registrado em: 16 Dez 2005 21:26
Localização: Ubatuba - SP

SQLITE 3 - Básico em Harbour

Mensagem por alaminojunior »

susviela@bol.com.br escreveu:
HASA escreveu: Um SQL Básico já resolveria

Incluir uma coluna:
ALTER TABLE cliente ADD COLUMN sexo char(1);

Mudar nome tabela:
ALTER TABLE cliente RENAME TO tbCliente;


Assim que tiver um tempinho vou publicar lá no blog uns exemplos SQLite.

https://programandoxbase.wordpress.com/
Não tenho certeza, mas com SQLite creio que não seja tão simples assim as alterações nas tabelas.
Posso estar enganado, mas até o próprio SQLiteStudio faz três tarefas para isso.
Podem confirmar essa informação ?
Compilador xHarbour 1.2.3 + Embarcadero C++ 7.30
MySQL c/ SQLRDD
HwGui + GTWVG
Marcos Kieron
Usuário Nível 2
Usuário Nível 2
Mensagens: 72
Registrado em: 14 Jan 2020 10:29
Localização: São Paulo/SP

SQLITE 3 - Básico em Harbour

Mensagem por Marcos Kieron »

Excelente para pesquisar e aprender a usar SQLite ou outros SGBD: https://www.sqlitetutorial.net/sqlite-alter-table/
Responder