O acesso a bases de dados é muito importante numa aplicação e esta pode ser a tarefa mais critica, dependendo da importância dos dados. Daí que o cuidado no manuseamento é muito importante e deve ser muito bem testado.
Existem diversas bases de dados, para diversos gostos e preços (algumas delas gratuitas), mas pessoalmente a minha escolha vai para o SQL Server. No caso da utilização de bases de dados em Microsoft Access (*.mdb) é necessário apenas alterar as classes sendo a estrutura igual (ex. SQL = SqlConnection; Access = OleDbConnection). Também é necessário alterar o namespace que se importa, não sendo o System.Data.SqlClient mas sim o System.Data.OleDb.
Esta é a primeira parte de um artigo que pretende mostrar como se executam algumas tarefas simples de inserção, actualização, eliminação e selecção de dados numa tabela de SQL. Os comandos mais utilizados para o manuseamento de informação são:
ExecuteNonQuery
Como o próprio nome indica serve para executar não query’s (selecções de dados) mas sim para executar comandos Transact-SQL como o INSERT, UPDATE e DELETE. Retorna um valor inteiro com o número de registos afectados pela operação.
ExecuteReader
Serve para executar selecções de dados retornando os registos da selecção efectuada
ExecuteScalar
Serve para executar comandos que retomem apenas um resultado, como por exemplo o total de registos, o maior valor numa determinada tabela, etc.
Nesta primeira parte irá ser abordado a inserção, actualização e eliminação de dados (ExecuteNonQuery), sendo a segunda parte dedicada à selecção de dados e à execução de operações que retornam apenas um valor (ExecuteReader e ExecuteScalar).
A estrutura base de todos os comandos é comum. É necessário criar uma ligação, executar um comando, utilizar a informação e finalmente fechar a ligação criada. Para criar uma ligação é necessário utilizar a classe SqlConnection. Neste caso, e para os exemplos de código, é utilizada uma base de dados que se encontra em anexa à aplicação, mas quando estiver no servidor, deverá ser alterada. Este é um exemplo simples mas para uma melhor organização e estruturada deve-se usar a classe SqlConnectionStringBuilder. Podem ainda ver alguns exemplos de ligações em ConnectionStrings.com.
INSERIR DADOS
Imports System.Data.SqlClient
' Texto de ligação à base de dados
Dim myConnectionString As String = _
"Data Source=.\SQLEXPRESS;AttachDbFilename='C:\myDatabase.mdf';" & _
";Integrated Security=True;User Instance=True"' Comando que irá inserir dados na tabela "MyTable" em que os campos
' "username" e "date" são passados através de parâmetros
Dim SQL As String = "INSERT INTO myTable([username], [date]) VALUES (@username, @date);"' Cria uma nova ligação à base de dados
Dim connection As New SqlConnection(myConnectionString)' Criação do comando indicando a instrução e a ligação
Dim command As New SqlCommand(SQL, connection)' Indicação dos parâmetros que serão inseridos
command.Parameters.Add("@username", SqlDbType.VarChar).Value = "jpaulino"
command.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now' Abre a ligação, executa o comando e guarda em "x" o número de registos inseridos
connection.Open()Dim x As Integer = command.ExecuteNonQuery()
If x < 1 Then
MessageBox.Show("A operação efectuada não retomou qualquer resultado.")
End If' Fecha a ligação e limpa as variáveis
connection.Close()
connection = Nothing
command = Nothing
ACTUALIZAR DADOS
Imports System.Data.SqlClient
' Texto de ligação à base de dados
Dim myConnectionString As String = _
"Data Source=.\SQLEXPRESS;AttachDbFilename='C:\myDatabase.mdf';" & _
";Integrated Security=True;User Instance=True"' Comando que irá actualizar os dados na tabela "MyTable" em que os campos
' "username" e "date" são passados através de parâmetros (o ID é um exemplo de um identificador único)
Dim SQL As String = "UPDATE myTable SET [username] = @username,[date] = @date WHERE [id] = @id"' Cria uma nova ligação à base de dados
Dim connection As New SqlConnection(myConnectionString)' Criação do comando indicando a instrução e a ligação
Dim command As New SqlCommand(SQL, connection)' Indicação dos parâmetros que serão actualizados
command.Parameters.Add("@username", SqlDbType.VarChar).Value = "jpaulino2"
command.Parameters.Add("@date", SqlDbType.DateTime).Value = DateTime.Now
command.Parameters.Add("@id", SqlDbType.Int).Value = 4' Abre a ligação, executa o comando e guarda em "x" o número de registos actualizados
connection.Open()Dim x As Integer = command.ExecuteNonQuery()
If x < 1 Then
MessageBox.Show("A operação efectuada não retomou qualquer resultado.")
End If' Fecha a ligação e limpa as variáveis
connection.Close()
connection = Nothing
command = Nothing
APAGAR DADOS
Imports System.Data.SqlClient
' Texto de ligação à base de dados
Dim myConnectionString As String = _
"Data Source=.\SQLEXPRESS;AttachDbFilename='C:\myDatabase.mdf';" & _
";Integrated Security=True;User Instance=True"' Comando que irá apagar todos os dados na tabela "MyTable" em que o campo
' "username" é igual ao parâmetros posteriormente indicado
Dim SQL As String = "DELETE FROM myTable WHERE [username] = @username"
' Cria uma nova ligação à base de dados
Dim connection As New SqlConnection(myConnectionString)
' Criação do comando indicando a instrução e a ligação
Dim command As New SqlCommand(SQL, connection)
' Indicação do parâmetro que irá ser apagado
command.Parameters.Add("@username", SqlDbType.VarChar).Value = "jpaulino2"
' Abre a ligação, executa o comando e guarda em "x" o número de registos eliminados
connection.Open()
Dim x As Integer = command.ExecuteNonQuery()
If x < 1 Then
MessageBox.Show("A operação efectuada não retomou qualquer resultado.")
End If
' Fecha a ligação e limpa as variáveis
connection.Close()
connection = Nothing
command = Nothing
Como podem verificar nos exemplos de código, o que muda essencialmente é o comando Transact-SQL. A estrutura é sempre igual para inserir, actualizar e apagar dados, podendo haver mais ou menos parâmetros. Os comandos T-SQL têm sempre esta estrutura:
“INSERT INTO Tabela (campo1, campo2) VALUES (valor1, valor2)”
“UPDATE Tabela SET campo1 = valor1, campo2 = valor2”
“DELETE FROM Tabela WHERE campos1 = valor1”
É importante ainda utilizar sempre um tratamento de erros (Try ... Catch ... Finally ... End Try) garantindo que se finaliza a ligação à base de dados e se efectue a limpeza das variáveis/classes criadas.
A segunda parte deste artigo é dedicada à selecção de dados e à execução de operações que retornam apenas um valor (ExecuteReader e ExecuteScalar).
PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!
19 comentários:
Podias nas connectionstrings utilizar as genéricas, que funcionam estejam as aplicações onde estiverem, desde que a base de dados a acompanhe...lol... no caso de ligações oledb usavas
Dim cs As String = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Application.StartupPath & "\bddemencia.mdb"
olá, sou o cyrax barbosa, é a primeira vez que acesso o vosso site, gostei muito das linhas de codigos de alguns projectos, mas gostaria imenso que disponibilizam se em download o projecto feito ouse com as suas intefaces para assim podemos ter uma idea mais clara daquilo que vamos fazer. ok
obrigado
Olá Cyrax Barbosa,
Obrigado pela visita.
Várias pessoas têm pedido isso e nos novos artigos tenho disponibilizado um exemplo.
Se precisares de algum em especial envia-me o teu email e qual pretendes.
Um abraço
Jorge Paulino
Olá Jorge Paulino,
Muito obrigado por me teres esclarecido em relação a estes conceitos.
Estou a estudar VB.NET à pouco tempo.
Eu sou programador web (ColdFusion, PHP) mas gostaria também de aprender vb.net.
Um abraço
César Oliveira
http://www.profissionalweb.net/sondagens/
estive a visitar o site: http://www.profissionalweb.net/sondagens/
e deixo um alerta para quem fez o site para ter em atenção os caracteres especiais, pois como está, nao está la muito bom...
foi so um comentario :D
Boas pessoal
Queria saber comandos para ligação à base de dados em SQL-Server .
Os comandos que preciso são os de Guardar, Eliminar, e procurar .
O procurar que eu queria era para aparecer numa listbox todos os items .
Penso que tenho de ter um ciclo , mas nao tenho a certeza .
responde para :
www.osiris_z0r@hotmail.com
Obrigado
Boas.
Como poderia fazer um botão que fosse a uma base de dados buscar um valor.
A ideia eh fazer uma especie de maquina registadora, em que o utilizador pode alterar o preço de um determinado produto.
Esse botao iria enviar o preço do produto para uma txtbox.
este é o excerto de codigo que tenho e que não me está a correr.
podias ajudar-me sfv?
-----------------------------------
Private Sub btnCrteM_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles btnCrteM.Click
Dim comando As String
comando = "SELECT preco tipo_trabalho FROM(trabalhos_tratamentos)WHERE(tipo_trabalho = '[busso]')"
'construção da classe sqlcommand
'Dim preco As String
Dim cmd As New SqlCommand(comando, db)
Dim dr As SqlDataReader 'declaraçao da classe sqldatareader
dr = cmd.ExecuteReader 'obtenção de dados
'carregamento de dados
txtNumero.Text = dr.Item("'[busso]'")
-----------------------------------
Obrigado.
Olá Tiago,
Que erro dá ? Em que comando ?
Se possível colocar essa informação no forum onde sou moderador porque é mais facil acompanhar lá.
Ola Jorge.
O erro que me dá é o seguinte:
Conversion from string "SELECT preco FROM(trabalhos)WHER" to type 'Integer' is not valid.
na seguinte linha:
dr = cmd.ExecuteReader(comando) 'obtenção de dados.
Se eu tirar o "(comando)" e deixar "()" dá me um erro de sintax.
Podemes dar entao o endereço do forum sfv?
Obrigado mais uma vez.
Tiago,
Coloca lá a questão em www.portugal-a-programar.org e mostra o código que tens agora, qual a linha onde dá erro e qual a mensagem de erro.
Boa tarde, eu queria saber como posso mostrar os valores da base de dados em outro form do vb...
Boas. Apenas tenho uma pequena dúvida: no caso das ligações a bases de dados em VB, o código é mesmo todo exactamente igual, apenas usando-se "OleDb" em vez de "SQL"?
Obrigado.
*ligações a bases de dados em Access
ola
Sou estudante e estou a criar uma base de dados em SQL Server para uma aplicação em vb (quiosque multimédia). A base de dados encontra-se feita mas falta o mais importante códigos. necessitava de códigos para adicionar e consultara informação na base de dados através de um form.
Será que alguém me pode ajudar?
Abraço
Olá,
Coloque a questão no fórum da comunidade, onde sou moderador, Portugal-a-Programar.
De qualquer forma recomendo a utilização do Entity Framework 4.0 pois simplifica bastante todo o processo de manipulação dos dados. Tenho alguns artigos neste blog de iniciação que certamente ajudaram a esclarecer.
Cumprimentos,
Jorge Paulino
Desde já obrigado por ter respondido a minha questão.
Não da para responder por aqui é que não consigo escrever qualquer comentário no fórum.
Quanto a utilização do Entity Framework 4.0 é algum programa que não tem nada a ver com o SQL Server?
Desculpe tantas perguntas e tanta ignorância mas eu sou mesmo novato nisto e não percebo mesmo nada.
Abraço
Aqui, só eu posso responder, enquanto no fórum existem bastantes pessoas que podem ajudar ... tens é de te registar para poder responder ;)
O Entity Framework é uma forma mais simples de executar operações como gravar, apagar, modificar ou inserir. Pode utilizar SQL Server ou outra base de dados.
Vê este artigo: http://www.jorgepaulino.com/2010/12/introducao-ao-entity-framework.html
Olá J. Paulino.
Obrigado por todas esta informação, espetacular... todos os iniciantes como eu devem estar agradecidos.
Estou a utilizar o exemplo de inserir dados e em simultâneo uma DataGridView a apresentar esses dados, também exemplificado em: http://www.jorgepaulino.com/2008/04/vbnet-utilizando-o-controlo.html
Estou com um problema, como atualizar o Dataset depois de com este método inserir o novo dado, para que "automaticamente" apareça na DataGridView sem ter que fazer o Fill novamente, não me parece logico fazer o Fill completo por cada dado inserido, com dados online então é ainda mais moroso. Deve existir uma solução só que não sei qual!
Já coloquei a questão no P@P: http://www.portugal-a-programar.pt/topic/66654-atualizar-dataset-datagridview/ mas a solução que apareceu foi em simultâneo registar e acrescentar o dado na DataGridView mas trás complicações fico sem o ID fico sem possibilidade de filtrar o Dataset offline etc...
Antes utilizava o método de inserir através do Dataset » TableAdapter assim á a atualização do Dataset, mas queria usar expressões SQL! Parece-me que é a boa pratica.
Agradecido desde já, obrigado...
Ola!
estou fazendo um sistema de login com banco de dados SQL mais esta dando erro SINTAXE INCORRETA PRÓXIMO A 'FORM'.
Alguem pode me ajudar por favor ?
If TB_nome.Text = "" Or TB_senha.Text = "" Then
LB_Resultado.Text = "Preencha o campo nome e senha"
TB_nome.Text = ""
TB_nome.Focus()
Exit Sub
End If
sql = "SELECT * form login where usuario="
sql += "'" & TB_nome.Text & "' and senha="
sql += "'" & TB_senha.Text & "'"
conectar.Open()
adaptar = New SqlDataAdapter(sql, conectar)
local = New DataSet
conectar.Close()
adaptar.Fill(local, "login") <==={o erro esta dando nesta linha}
resultado = local.Tables("login").Rows.Count
If resultado > 0 Then
registro = local.Tables("login").Rows(0)
vnivel = registro("Nivel")
ElseIf resultado = 0 Then
BT_logar.Enabled = False
LB_Resultado.Text = "Nome ou senha incorretos "
End If
End Sub
Enviar um comentário