Visual Basic em Português

Página pessoal de Jorge Paulino sobre o Visual Basic (VB.NET, ASP.NET, VB6, VBA) e algumas noticias de tecnologia

VB.NET: Gestão de Dados em SQL Server - Parte I

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:

Py_ disse...

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"

Anónimo disse...

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

Jorge Paulino disse...

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

Anónimo disse...

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/

Anónimo disse...

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

Cabreiros disse...

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

Tiago Rocha disse...

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.

Unknown disse...

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á.

Tiago Rocha disse...

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.

Jorge Paulino disse...

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.

Anónimo disse...

Boa tarde, eu queria saber como posso mostrar os valores da base de dados em outro form do vb...

Anónimo disse...

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.

Anónimo disse...

*ligações a bases de dados em Access

Anónimo disse...

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

Jorge Paulino disse...

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

Anónimo disse...

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

Jorge Paulino disse...

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

vastri - Vasco disse...

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...

Unknown disse...

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



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject
Google-Translate-ChineseGoogle-Translate-Portuguese to FrenchGoogle-Translate-Portuguese to GermanGoogle-Translate-Portuguese to ItalianGoogle-Translate-Portuguese to JapaneseGoogle-Translate-Portuguese to EnglishGoogle-Translate-Portuguese to RussianGoogle-Translate-Portuguese to Spanish

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico