Hoje vou mostrar como podemos usar o SQL Server Compact 4.0 (x64) em uma aplicação Windows Forms usando a linguagem C#.
O Microsoft SQL Server Compact 4.0 permite criar banco de dados compactos que podem ser distribuídos em computadores desktop, smart devices, e Tablets.
Quando você cria aplicações que usa o SQL Server Compact você pode usar tanto a linguagem Visual Basic .NET como a linguagem C# e o .NET Framework ou .NET Compact Framework para criar e gerenciar a aplicação.
O SQL Server Compact oferece os seguintes recursos que você deve considerar quando pretender usá-lo como local de armazenamento de dados para suas aplicações:
Quando usar o SQL Server Compact ?
O SQL Server Compact é um banco de dados baseado em arquivo que consiste em DLLs que ocupam cerca de 1,4 MB. A lista a seguir fornece algumas situações em que você pode querer usar o SQL Server Compact em suas aplicações:
fonte: http://msdn.microsoft.com/en-us/library/aa983341%28v=vs.110%29.aspx - Acessado em fevereiro de 2014
Neste artigo iremos abordar os seguinte assuntos:
Recursos utilizados:
Preparando o ambiente - Criando o Projeto
Abra o Visual Studio 2012 Express for Windows desktop e clique em New Project;
Selecione o template Visual C# -> Windows e a seguir Windows Forms Application;
Informe o nome Gerenciando_SQL_Server_Compact4 e clique no botão OK;
No menu PROJECT clique em Add Reference;
Na janela Reference Manager clique em Browse e localize a pasta onde você instalou os arquivos do SQL Server Compact 4 selecionando a referência conforme abaixo:
Atenção ! Se você tiver mais uma versão instalada verifica atentamente para estar referenciado a versão correta ou ocorreram erros no projeto.
Agora no formulário form1.cs inclua o seguintes controles:
Disponha os controles conforme o leiaute da figura abaixo:
Defina os seguintes namespaces no formulário form1.cs:
using
using
System.Data;using
System.Text;using
System.Windows.Forms;using
System.Data.SqlServerCe;using
System.IO;using
Microsoft.VisualBasic;
Agora vamos definir o código em cada evento Click de cada um dos botões de comando.
1- Criar Banco de dados
private void btnCriarBD_Click(object sender, EventArgs e)
{
/* define os parâmetros para o inputbox */
string Prompt = "Informe o nome do Banco de Dados a ser criado.Ex: Teste.sdf";
string Titulo = "www.macoratti.net";
string Resultado = Interaction.InputBox(Prompt, Titulo, @"c:\dados\Agenda.sdf", 650, 350);
/* verifica se o resultado é uma string vazia o que indica que foi cancelado. */
if (Resultado != "")
{
'verifica se o nome informado contém o texto ".sdf"
if (!Resultado.Contains(".sdf"))
{
MessageBox.Show("Informe a extensão .sdf no arquivo...");
return;
}
try
{
string connectionString;
string nomeArquivoBD = Resultado;
string senha = "";
'verifica se o arquivo com o nome informado já existe
if (File.Exists(nomeArquivoBD))
{
if (MessageBox.Show("O arquivo já existe !. Deseja excluir e criar novamente ? ", "Excluir", MessageBoxButtons.YesNo,
MessageBoxIcon.Information) == DialogResult.Yes)
{
File.Delete(nomeArquivoBD);
}
else
{
return;
}
}
'monta a string de conexão com o banco de dados
connectionString = string.Format("DataSource=\"{0}\"; Password='{1}'", nomeArquivoBD, senha);
if (MessageBox.Show("Será criado arquivo " + connectionString +" Confirma ? ", "Criar", MessageBoxButtons.YesNo,
MessageBoxIcon.Information) == DialogResult.Yes)
{
SqlCeEngine SqlEng = new SqlCeEngine(connectionString);
SqlEng.CreateDatabase();
lblResultado.Text = "Banco de dados " + nomeArquivoBD + " com sucesso !";
}
else
{
return;
}
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
else
{
MessageBox.Show("A operação foi cancelada...");
}
}
|
Neste código vamos criar um banco de dados SQL Server Compact usando o inputbox para que o usuário informe o nome do banco de dados.
O inputbox exibe um prompt em uma caixa de diálogo que aguarda que um texto seja informado ou um dos botões seja clicado e então retorna uma string contendo o conteúdo do TextBox.
E como usar o inputbox na linguagem C# ?
A saída mais fácil é fazer uma referência no seu projeto a Microsoft.VisualBasic.
No menu Project selecione Add Reference e na guia .NET selecione Microsoft.VisualBasic e clique em OK;
Após isso basta usar o método Interaction.InputBox.
Para detalhes em como use este recurso leia o meu artigo: C# - Usando InputBox
A criação do banco de dados é feita pelo seguinte código :
SqlCeEngine SqlEng = new SqlCeEngine(connectionString);
SqlEng.CreateDatabase();
O método CreateDataBase() cria o banco de dados.
Após informar o nome verificamos se foi informada a extensão .sdf no arquivo:
if
(!Resultado.Contains(".sdf"))
{
MessageBox.Show("Informe a extensão .sdf no
arquivo...");
return;
}
Antes de criar o banco de dados estou verificando se o arquivo com o nome
informado já existe:
if (File.Exists(nomeArquivoBD))
....
Se o arquivo existir realizamos a exclusão do mesmo usando o método Delete da classe File:
if
(File.Exists(nomeArquivoBD)) { if (MessageBox.Show("O arquivo já existe !. Deseja excluir e criar novamente ? ", "Excluir", MessageBoxButtons.YesNo, MessageBoxIcon.Information) == DialogResult.Yes) { File.Delete(nomeArquivoBD); } else { return; } } |
2- Criar tabelas
private void btnCriarTabelas_Click(object sender, EventArgs e)
{
/* define os parâmetros para o inputbox */
string Prompt = "Informe o nome da tabela a ser criada.Ex: Teste";
string Titulo = "www.macoratti.net";
string Resultado = Interaction.InputBox(Prompt, Titulo, "Contatos", 650, 350);
/* verifica se o resultado é uma string vazia o que indica que foi cancelado. */
if (Resultado != "")
{
if (Resultado.Contains(".sdf"))
{
MessageBox.Show("Não informe a extensão .sdf no arquivo...");
return;
}
//criamos um conexão
SqlCeConnection cn = new SqlCeConnection(stringConexao());
//verifica se a conexão esta fechada e abre a conexão
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
//definimos um objeto command
SqlCeCommand cmd;
//montamos uma instrução SQL usando Create Table definindo a estrutura da tabela a ser criada
string sql = "create table " + Resultado + "("
+ "Nome nvarchar (60) not null, "
+ "Sobrenome nvarchar (80), "
+ "URL nvarchar (150) )";
cmd = new SqlCeCommand(sql, cn);
if (MessageBox.Show("Confirma a criação da tabela ? ", "Criar Tabela", MessageBoxButtons.YesNo,
MessageBoxIcon.Information) == DialogResult.Yes)
{
try
{
//cria a tabela no banco de dados
cmd.ExecuteNonQuery();
lblResultado.Text = "Tabela " + Resultado + " criada com sucesso ";
}
catch (SqlCeException sqlexception)
{
MessageBox.Show(sqlexception.Message, "Caramba.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Caramba.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
cn.Close();
}
}
else
{
return;
}
}
else
{
MessageBox.Show("A operação foi cancelada...");
}
}
|
Para criar uma tabela no banco de dados SQL Server Compact 4.0 montamos uma string de conexão usando a instrução Create Table e definindo a estrutura da tabela.
string sql = "create table " + Resultado + "("
+ "Nome nvarchar (60) not null, "
+ "Sobrenome nvarchar (80), "
+ "URL nvarchar (150) )";
O método ExecuteNonQuery() é quem cria a tabela no banco de dados.
3- Carregar uma Tabela com dados
Na rotina a seguir
estamos chamando o método CarregarLinha() e passando os valores para
preencher a tabela com dados:
private void btnCarregarTabela_Click(object sender, EventArgs e)
{
try
{
CarregarLinha("Macoratti", "Jose Carlos", @"http:\\www.macoratti.net");
CarregarLinha("Janice", "Rachel", @"janjan@uol.com.br");
CarregarLinha("Jefferson", "Andre", @"jeff@bol.com.br");
CarregarLinha("Miriam", "Estela", @"mimi@hotmail.com");
CarregarLinha("Jessica", "Naara", @"jessicalang@ig.com.br");
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Oxente.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
|
O método CarregarLinha() recebe os parâmetros e monta uma instrução SQL insert into para incluir os valores na tabela usando o método ExecuteNonQuery().
private void CarregarLinha(string nome, string sobrenome, string url)
{
SqlCeConnection cn = new SqlCeConnection(stringConexao());
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
SqlCeCommand cmd;
string sql = "insert into Contatos "
+ "(sobrenome, nome, url) "
+ "values (@sobrenome, @nome, @url)";
try
{
cmd = new SqlCeCommand(sql, cn);
cmd.Parameters.AddWithValue("@sobrenome", sobrenome);
cmd.Parameters.AddWithValue("@nome", nome);
cmd.Parameters.AddWithValue("@url", url);
cmd.ExecuteNonQuery();
lblResultado.Text = "Linha Incluída.";
}
catch (SqlCeException sqlexception)
{
MessageBox.Show(sqlexception.Message, "Uaí Sô.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Uaí Sô.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
cn.Close();
}
}
|
a
4- Carregar Grid
private void btnCarregarGrid_Click(object sender, EventArgs e)
{
SqlCeConnection cn = new SqlCeConnection(stringConexao());
if (cn.State==ConnectionState.Closed)
{
try
{
cn.Open();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
try
{
// define o command par ausar a tabela e não a consulta
SqlCeCommand cmd = new SqlCeCommand("Contatos", cn);
cmd.CommandType = CommandType.TableDirect;
// Pega a tabela
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable);
// carrega o resultado no grid
dgvDados.DataSource = rs;
}
catch (SqlCeException sqlexception)
{
MessageBox.Show(sqlexception.Message, "Arre Égua.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Arre Égua.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
}
|
Para carregar o DataGridView - dgvDados - usamos a classe SqlCeResultSet que representa um cursor que pode ser atualizado, navegado e vinculado.
A seguir usamos o método cmd.ExecuteResultSet que envia um CommandText a uma Connection e cria um SqlCeResultSet usando a enumeração ResultSetOptions.
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable);
Os valores possíveis para ResultSetOptions são:
None - Nenhuma opção de ResultSet foi especificada.
Updatable - O ResultSet permite atualizações.
Scrollable - É possível rolar o ResultSet para frente e para trás
Sensitive - O ResultSet detecta as alterações feitas à fonte de dados
Insensitive - O ResultSet não detecta as alterações feitas à fonte de dados.
5- Ler Registros da
tabela
private void btnLerRegistros_Click(object sender, EventArgs e)
{
SqlCeConnection cn = new SqlCeConnection(stringConexao());
if (cn.State == ConnectionState.Closed)
{
cn.Open();
}
// Monta a consulta SQL
string sql = "select sobrenome, nome from Contatos ";
try
{
SqlCeCommand cmd = new SqlCeCommand(sql, cn);
cmd.CommandType = CommandType.Text;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable);
// se você precisa atualizar o result set então use:
// SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable | ResultSetOptions.Updatable);
if (rs.HasRows)
{
int ordSobrenome = rs.GetOrdinal("sobrenome");
int ordNome = rs.GetOrdinal("nome");
// trata a saida
StringBuilder saida = new StringBuilder();
// le o primeiro registro e pega os dados
rs.ReadFirst();
saida.AppendLine(rs.GetString(ordNome) + " " + rs.GetString(ordSobrenome));
while (rs.Read())
{
saida.AppendLine(rs.GetString(ordNome) + " " + rs.GetString(ordSobrenome));
}
// defina a saida
lblResultado.Text = saida.ToString();
}
else
{
lblResultado.Text = "Nenhum registro encontrado.";
}
}
catch (SqlCeException sqlexception)
{
MessageBox.Show(sqlexception.Message, "Bah Tchê.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
catch (Exception ex)
{
MessageBox.Show(ex.Message, "Bah Tchê.", MessageBoxButtons.OK, MessageBoxIcon.Error);
}
finally
{
cn.Close();
}
}
|
No código acima estamos obtendo os dados usando um SqlResultSet com a opção Scrollabe:
SqlCeCommand cmd = new SqlCeCommand(sql, cn);
cmd.CommandType = CommandType.Text;
SqlCeResultSet rs = cmd.ExecuteResultSet(ResultSetOptions.Scrollable);
A percorremos o resultado e montamos uma StringBuilder com as informações para sobrenome e nome da tabela e exibimos no controle Label (lblResultado) no formulário:
if (rs.HasRows) { int ordSobrenome = rs.GetOrdinal("sobrenome"); int ordNome = rs.GetOrdinal("nome"); // trata a saida StringBuilder saida = new StringBuilder(); // le o primeiro registro e pega os dados rs.ReadFirst(); saida.AppendLine(rs.GetString(ordNome) + " " + rs.GetString(ordSobrenome)); while (rs.Read()) { saida.AppendLine(rs.GetString(ordNome) + " " + rs.GetString(ordSobrenome)); } // define a saida lblResultado.Text = saida.ToString(); } else { lblResultado.Text = "Nenhum registro encontrado."; } |
Abaixo vemos uma figura do projeto em execução:
Pegue o projeto completo aqui : Gerenciando_SQL_Server_Compact_4.zip
João 5:39 Examinais as Escrituras, porque julgais ter nelas a vida eterna; e são elas que dão testemunho de mim;
João 5:40 mas não quereis vir a mim para terdes vida!
João 5:41 Eu não recebo glória da parte dos homens;
João 5:42 mas bem vos conheço, que não tendes em vós o amor de Deus.
Referências:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#