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 II

Esta é a segunda parte de um artigo que pretende mostrar como se executam algumas tarefas simples de gestão de dados em SQL. A primeira parte foi dedicada a comandos de inserção, actualização e eliminação de dados e esta segunda parte será dedicada a selecção de dados e à execução de operações que retornam apenas um valor (ExecuteReader e ExecuteScalar).

SELECÇÃO DE DADOS

A selecção de dados é a execução de um comando que retorna os registos da selecção efectuada através de linhas (rows). É quando existe a necessidade de aceder ao servidor para mostrar os dados inseridos, quer em lista, em caixas de texto, impressão, etc.

Esta selecção tem uma estrutura bastante semelhante às anteriormente mostradas , existindo pequenas alterações.

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"

' Selecção à  tabela "MyTable" em que o campo "username"
' será passado através de parâmetros posteriormente
Dim SQL As String = "SELECT * 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 dos parâmetros da selecção
command.Parameters.Add("@username", SqlDbType.VarChar).Value = "jpaulino"

' Abre a ligação
connection.Open()

' Executa o comando colocando num SqlDataReader os resultados
Dim reader As SqlDataReader = command.ExecuteReader()

' Caso existam rows (linhas)
If reader.HasRows Then

    ' Executa um ciclo nas linhas existentes mostrando o campo “username”
     While reader.Read()
        Debug.WriteLine(reader.Item("username"))
     End While 

End If

' Fecha a ligação e limpa as variáveis
connection.Close()
connection = Nothing
command = Nothing

Este exemplo mostra apenas como visualizar um campo (“username”) mas o importante é a instrução de selecção que poderá ser muito mais complexa, usando agrupamentos, somatórios, mais campos de selecção, etc.

 SELECCIONAR UM RESULTADO APENAS

O método ExecuteScalar executa uma selecção e retorna a primeira coluna da primeira linha. É mais rápido na execução do que o ExecuteReader e é utilizado para seleccionar um resultado apenas, com por exemplo, apenas um campo de um registo, o total de registos inseridos, o ultimo ID inserido, etc.

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"

' Selecciona da  tabela "MyTable" o máximo/último ID (identificador único)
Dim SQL As String = " SELECT MAX(ID) FROM myTable"

' 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)

' Abre a ligação
connection.Open()

‘ Executa o comando e guarda em “total” o último registo
Dim total As Integer = command.ExecuteScalar()
Debug.WriteLine("Último registo inserido = " + total.ToString)

' Fecha a ligação e limpa as variáveis
connection.Close()
connection = Nothing
command = Nothing


Essencialmente estes são os comandos mais utilizados e os métodos mais práticos para a gestão de dados num servidor SQL.

 

PS: Como sempre, qualquer dúvida, comentário ou correcção ao artigo é sempre bem vinda!

22 comentários:

Jonas Chaves disse...

Parabens mesmo.
Raridade encontrar coisas que prestam na net para iniciantes em VB 2008.

snis disse...

agradeço a quem teve a ideia de postar esta ajuda.

Muito Obrigado

Anónimo disse...

Alo!

Gostei muito dos teus artigos, foram de encontro as minhas necessidades.
Ja faz muito tempo que procuro algum material sobre conexao com banco de dados em vb.net.

Obrigado!!!

Anónimo disse...

onde devo de meter este codigo?

Preciso de ajuda. se alguem poder ajudar agradecia :)

Jorge Paulino disse...

Não entendo!

Este código é para manipular informação de SQL, não sei qual é o problema.

Made Style disse...

Parabéns velho... muito boa postagem... esclareceu quase todas as minhas duvidas. soh tem uma que não consigo resolver... como eu consigo colocar um valor dentro de uma variavel... estou com o seguinte codigo:

Dim conn As SqlConnection
Dim sql As SqlCommand
Dim reader As SqlDataReader
Dim script As String = "SELECT * FROM usuario WHERE (usr_login = '" & usr_log.Text & "') AND (usr_senha = '" & passwd.Text & "')"

If ((usr_log.Text = "") Or (passwd.Text = "")) Then
MsgBox("Preencha corretamente os campos de usuário e senha!", MsgBoxStyle.Critical, "Erro!")
Else
conn = New SqlConnection("server=localhost;database=estoque;uid=sa;pwd=jnsjwbe")
conn.Open()
sql = New SqlCommand(script, conn)
reader = sql.ExecuteReader()

If (reader.HasRows) Then
est_Principal.nameuser = reader.Item("usr_nome")
est_Principal.Show()
conn.Close()
Me.Close()
Else
conn.Close()
MsgBox("Senha ou Usuário invalido.", MsgBoxStyle.Critical, "Erro de login")
End If
End If


mas não estu conseguindo executar o código em negrito... aparece uma msg que diz que nm existe valor... e o campo bate com o nome do campo no banco... o que eu posso fazer??

Jorge Paulino disse...

Para colocar um valor dentro de uma variável pode ver em "SELECCIONAR UM RESULTADO APENAS", que mostra como utilizar o método ExecuteScalar()

No entantom nesse código, falta o
While reader.Read()

est_Principal.nameuser = reader.Item("usr_nome")

End While

Tiago disse...

Gostaria de saber como fazemos uma pesquisa numa bd, a partir de um programa feito em vb.net, em que procuramos por "ana", e aparecerem todos os nomes que tenham "ana", Ex. Mariana, Anabela, etc.

Jorge Paulino disse...

Olá,

Só tens de alterar o comando T-SQL, fazendo algo como (não testado):

"SELECT * FROM MyTable WHERE * nome LIKE '%ana%'"

É só substituir o nome (ana) por uma variável.

Anónimo disse...

Olá, não sei se me pode ajudar, mas tenho este código num modulo em Vb6

Global REL As New ADODB.Connection
Public Sub Config()
On Local Error GoTo erro

BASEDADOS = Dir(App.Path & "\RELAV.mdb")

REL.Open "Provider=Microsoft.Jet.OLEDB.4.0;Persist Security Info=False;Data Source=" & BASEDADOS & ";Jet OLEDB:Database Password=xxxxxx"


Exit Sub
erro:
End Sub

--
e quero passa-lo para visual studio 2010 em sql
o que pretendo é que a ligação seja feita a través de um modulo

e sempre que eu pretendo consultar a base ou alterá-la basta-me escrever:
pesq.Open "select * from departamento where Esq ='" & dados & "'", REL, , adLockReadOnly

Obrigado

Jorge Paulino disse...

Olá,

Não faz sentido nenhum continuar isso tipo de ligações em Visual Studio 2010. É preciso colocar um ponto final no passado e mudar para formas mais correctas/eficazes.

Recomento a utilização de Entity Framework pois facilita imenso. Veja este artigo: Introdução ao Entity Framework ou, caso não opte por este ORM, usar as classes SqlConnection, SqlCommand, etc (como mostra o artigo).

Esse tipo de ligações está ultrapassado.

Cumprimentos,
Jorge Paulino

Anónimo disse...

Já tive a ver, penso que agora vou conseguir.

Já agora, qualquer SQL server serve para o exemplo apresentado?

Obrigado pela ajuda.

João Carvalho

Jorge Paulino disse...

Sim, não testei em todas, mas nas versões mais recentes funciona bem(desde a 2000 pelo menos)

Anónimo disse...

Mais uma vez!
Instalei o SQL SERVER 2008, mas não consigo criar a base de dados aí. Pode-me ajudar?

João Carvalho

Jorge Paulino disse...

Não consegue como? Dá erro?

Anónimo disse...

Tenho este código mas dá este erro: Error 4 Value of type 'System.Windows.Forms.TextBox' cannot be converted to 'String'. C:\Documents and Settings\Administrator\Desktop\SECÇÃO MATERIAL\PROGRAMA\Copy of Logistica\Logistica\frmGeral.vb 16 29 Logistica


Using context As New LogisticaEntities
Dim esquadra As New Esquadra With
{
.Nome = txtNome,
.Morada = txtMorada,
.CPostal = txtCP,
.CPostal1 = txtCP1,
.Localidade = txtLocal,
.Email = txtEmail,
.PContact = txtPesCont,
.Telef = txtTelf,
.Telem = txtTelem,
.Inter = txtInt,
.Extens = txtExt
}
context.EsquadraSet.AddObject(esquadra)
context.SaveChanges()
End Using

Como posso corrigir

Jorge Paulino disse...

À primeira vista falta indicar o que queres da TextBox ... exemplo:

Using context As New LogisticaEntities
Dim esquadra As New Esquadra With
{
.Nome = txtNome.Text,
.Morada = txtMorada.Text,
etc

Anónimo disse...

Só mais esta (por agora)
O que quer dizer isto (Warning 3 Error 11007: Entity type 'Esquadra' is not mapped. C:\Documents and Settings\Administrator\Desktop\SECÇÃO MATERIAL\PROGRAMA\Copy of Logistica\Logistica\Model1.edmx 46 9 Logistica
)
O que tenho de fazer

João Carvalho

Anónimo disse...

Using context As New LogisticaEntities
Dim esquadr As New Esquadra With
{
.Nome = txtNome.Text,
.Morada = txtMorada.Text,
.CPostal = txtCP.Text,
.CPostal1 = txtCP1.Text,
.Localidade = txtLocal.Text,
.Email = txtEmail.Text,
.PContact = txtPesCont.Text,
.Telef = txtTelf.Text,
.Telem = txtTelem.Text,
.Inter = txtInt.Text,
.Extens = txtExt.Text
}
context.EsquadraSet.AddObject(esquadr)
context.SaveChanges() 'nesta linha da-me este erro: Schema specified is not valid. Errors:
Model1.msl(3,4) : error 2062: No mapping specified for instances of the EntitySet and AssociationSet in the EntityContainer LogisticaEntities.
End Using
End Sub

Podes-me ajudar.

Jorge Paulino disse...

http://www.portugal-a-programar.org/forum/index.php/topic,53022.0.html

Anónimo disse...

Não consigo passar disto....

Joao Carvalho

Peters disse...

Muito bom, só no caso do sqlServerCompact, a função 'HasRows' não é suportada.

Mensagens Recentes



Microsoft Office Especialist

Membro da Comunidade
Experts-Exchange


Administ. da Comunidade
Portugal-a-Programar



Twitter

Artigos no CodeProject

Artigos no CodeProject

Subscrever Novidades

Endereço de Email:

Delivered by FeedBurner

Seguidores

Histórico