Antigamente para utilizar a base de dados SQLite em .NET era um pouco complicado, porque precisavamos utilizar as DLLs do SQLite através do PInvoke em .NET. Agora no site oficial do SQLite foi inserida a biblioteca System.Data.SQLite para ser utilizada em aplicações .NET.
Para este post criei uma Aplicação Console para manipular as informações de uma base de dados de livros. Nesta aplicação o usuário poderá cadastrar, excluir, alterar e visualizar os livros existentes na base de dados.
Para utilizar a biblioteca do SQLite em .NET é necessário fazer o download da biblioteca e instalar na máquina de desenvolvimento. A biblioteca pode ser baixada no site oficial do SQLite.
No projeto Console no Visual Studio é necessário incluir uma referência à Dll System.Data.SQLite.dll, que normalmente é instalada no diretório C:\Arquivos de Programas\System.Data.SQLite\2008\bin.
No projeto Console foi criada a classe SqliteDb que possui os métodos para inserir, alterar e excluir dados da base SQLite, a classe auxiliar Livro (Listagem 1) que é utilizada para armazenar os dados do livro que está sendo utilizado pelos outros métodos e a classe Program que possui o método Main e outros métodos auxiliares para executar a aplicação.
Listagem 1:
public class Livro { public long id { get; set; } public string titulo { get; set; } public string autor { get; set; } public string ano { get; set; } public string genero { get; set; } }
A seguir são detalhados os métodos que fazem parte da classe SqliteDb:
Foram criadas duas constantes, uma para definir o nome da base de dados e a outra para definir a conexão com a base de dados SQLite.
const string DATABASE_NAME = "livros_classicos.db"; const string CONNECTION = "Data Source=" + DATABASE_NAME;
O método CreateDatabase() cria a base de dados livros_classicos.db, se não existir e cria a tabela livros:
public void CreateDatabase() { SQLiteConnection conn = new SQLiteConnection(CONNECTION); try { if (!File.Exists(DATABASE_NAME)) { SQLiteConnection.CreateFile(DATABASE_NAME); // Cria a tabela livros conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.CommandText = "CREATE TABLE livros (" + "id INTEGER NOT NULL PRIMARY KEY," + "titulo TEXT," + "autor TEXT," + "ano_publicacao TEXT," + "genero TEXT)"; cmd.ExecuteNonQuery(); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (conn != null) { conn.Close(); } } }O método InsertLivro(Livro) insere um livro na base:
public bool InsertLivro(Livro livro) { bool resultado = false; SQLiteConnection conn = new SQLiteConnection(); try { conn.ConnectionString = CONNECTION; conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@Titulo", livro.titulo); cmd.Parameters.AddWithValue("@Autor", livro.autor); cmd.Parameters.AddWithValue("@Ano", livro.ano); cmd.Parameters.AddWithValue("@Genero", livro.genero); cmd.CommandText = "INSERT INTO livros " + "(titulo, autor, ano_publicacao, genero) " + "VALUES (@Titulo, @Autor, @Ano, @Genero)"; int registro = cmd.ExecuteNonQuery(); // Verifica se o registro foi inserido if (registro == 1) { resultado = true; } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (conn != null) { conn.Close(); } }
O método SearchLivro(string) faz a procura de livros por título e retorna a lista de livros filtrados. Neste método optei em fazer uma busca utilizando o operador LIKE do SQL para fazer uma busca por padrão e não uma busca exata.
public List<Livro> SearchLivro(string titulo) { List<Livro> livros = new List<Livro>(); SQLiteConnection conn = new SQLiteConnection(); try { conn.ConnectionString = CONNECTION; conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@Titulo", titulo); cmd.CommandText = "SELECT * FROM livros WHERE titulo LIKE '%" + titulo + "%'"; SQLiteDataReader reader = cmd.ExecuteReader(); while (reader.Read() == true) { Livro livro = new Livro(); livro.id = (long)reader["id"]; livro.titulo = (string)reader["titulo"]; livro.autor = (string)reader["autor"]; livro.ano = (string)reader["ano_publicacao"]; livro.genero = (string)reader["genero"]; livros.Add(livro); } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (conn != null) { conn.Close(); } } return livros; }
O método UpdateLivro(Livro) atualiza os dados do livro.
public string UpdateLivro(Livro livro) { string resultado = ""; SQLiteConnection conn = new SQLiteConnection(); try { conn.ConnectionString = CONNECTION; conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@Id", livro.id); cmd.Parameters.AddWithValue("@Titulo", livro.titulo); cmd.Parameters.AddWithValue("@Autor", livro.autor); cmd.Parameters.AddWithValue("@Ano", livro.ano); cmd.Parameters.AddWithValue("@Genero", livro.genero); cmd.CommandText = "UPDATE livros SET titulo=@Titulo, autor=@Autor," + " ano_publicacao=@Ano, genero=@Genero WHERE id=@Id"; int registroAtualizado = cmd.ExecuteNonQuery(); if (registroAtualizado == 1) { resultado = "O livro foi atualizado com sucesso."; } else { resultado = "O livro não foi atualizado."; } } catch (Exception ex) { Console.WriteLine(ex.Message); } finally { if (conn != null) { conn.Close(); } } return resultado; }O método DeleteLivro(string) apaga o livro filtrado, na base de dados, através do id do livro.
public string DeleteLivro(string id) { string resultado = ""; SQLiteConnection conn = new SQLiteConnection(); try { conn.ConnectionString = CONNECTION; conn.Open(); SQLiteCommand cmd = new SQLiteCommand(); cmd.Connection = conn; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@Id", id); cmd.CommandText = "DELETE FROM livros WHERE id=@Id"; int registroAtualizado = cmd.ExecuteNonQuery(); if (registroAtualizado == 1) { resultado = "O livro foi excluído com sucesso."; } else { resultado = "O livro não foi excluído."; } } catch (Exception ex) { resultado = ex.Message; } return resultado; } }A seguir são detalhados os métodos que fazem parte da classe Program:
O método Main é o responsável pela inicialização e execução da aplicação:
static void Main(string[] args) { ConsoleKeyInfo key = new ConsoleKeyInfo(); Console.WriteLine("Digite S a qualquer momento" + " para sair da aplicação!"); SqliteDb sqlitedb = new SqliteDb(); // Cria a base de dados se não existir sqlitedb.CreateDatabase(); while (true) { Console.WriteLine("Digite I para incluir, A para alterar," + " E para excluir, P para pesquisar e V para visualizar todos os livros:"); // Lê a tecla digitada key = Console.ReadKey(true); // Sai da aplicação if (key.KeyChar == 'S' || key.KeyChar == 's') { break; } // Pesquisa um livro por título if (key.KeyChar == 'P' || key.KeyChar == 'p') { Console.WriteLine("Digite o título do livro a ser pesquisado:"); string titulo = Console.ReadLine(); // Exibe as informações do livro BuscarLivro(titulo); } // Inclui um livro if (key.KeyChar == 'I' || key.KeyChar == 'i') { // Lê as informações do livro a ser inserido Livro livro = GetLivro(); // Insere o livro if (sqlitedb.InsertLivro(livro) == true) { Console.WriteLine("O livro foi incluído com sucesso!"); } } // Exclui um livro if (key.KeyChar == 'E' || key.KeyChar == 'e') { Console.WriteLine("Digite o título do livro a ser excluído:"); string titulo = Console.ReadLine(); // Buscar o livro List<Livro> livros = BuscarLivro(titulo); // Obtêm o Id do livro a ser excluído string id = GetId(livros); if (id != "") { // Exclui o livro string resultado = sqlitedb.DeleteLivro(id); Console.WriteLine(resultado); } } // Altera um livro if (key.KeyChar == 'A' || key.KeyChar == 'a') { Console.WriteLine("Digite o título do livro a ser alterado:"); string titulo = Console.ReadLine(); // Buscar livro List<Livro> livros = BuscarLivro(titulo); // Obtêm o Id do livro a ser alterado string id = GetId(livros); if (id != "") { // Lê as novas informações do livro a ser alterado Livro livro = GetLivro(); // Atualiza o valor do id livro.id = long.Parse(id); ; // Altera as informações do livro string resultado = sqlitedb.UpdateLivro(livro); Console.WriteLine(resultado); } } } }O método possui um loop while que apresenta um menu para que o usuário possa selecionar a função que deseja executar ou sair da aplicação. Quando a aplicação é executada é apresentado o seguinte menu:
Digite S a qualquer momento para sair da aplicação!
Digite I para incluir, A para alterar, E para excluir, P para pesquisar e V para
visualizar todos os livros:
Além do método Main a classe Program possui também os métodos BuscarLivro(string), GetId(List<Livro) e GetLivro().
O método BuscarLivro(string) faz a busca dos livros por título e retorna uma lista de livros.
private static List<Livro> BuscarLivro(string titulo) { SqliteDb sqlitedb = new SqliteDb(); List<Livro> livros = sqlitedb.SearchLivro(titulo); Console.WriteLine(); foreach (Livro item in livros) { Console.WriteLine(item.id + "\t" + item.titulo + "\t" + item.autor + "\t" + item.ano + "\t" + item.genero); } Console.WriteLine(); return livros; }O método GetId(List<Livro> livros) faz a busca dos livros e retorna o id do livro.
private static string GetId(List<Livro> livros) { // Digitar o id do livro a ser alterado se houver mais de // um livro como resultado string id = ""; if (livros.Count == 0) { Console.WriteLine("O livro não foi encontrado."); } else if (livros.Count == 1) { id = livros[0].id.ToString(); } else { Console.WriteLine("Digite o id do livro a ser alterado:"); id = Console.ReadLine(); } return id; }O método GetLivro() retorna um objeto livro com os detalhes do livro.
private static Livro GetLivro() { Livro livro = new Livro(); Console.WriteLine("Digite o título do livro:"); livro.titulo = Console.ReadLine(); Console.WriteLine("Digite o autor do livro:"); livro.autor = Console.ReadLine(); Console.WriteLine("Digite o ano de publicação do livro:"); livro.ano = Console.ReadLine(); Console.WriteLine("Digite o gênero do livro:"); livro.genero = Console.ReadLine(); return livro; }