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:
Parabens mesmo.
Raridade encontrar coisas que prestam na net para iniciantes em VB 2008.
agradeço a quem teve a ideia de postar esta ajuda.
Muito Obrigado
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!!!
onde devo de meter este codigo?
Preciso de ajuda. se alguem poder ajudar agradecia :)
Não entendo!
Este código é para manipular informação de SQL, não sei qual é o problema.
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??
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
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.
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.
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
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
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
Sim, não testei em todas, mas nas versões mais recentes funciona bem(desde a 2000 pelo menos)
Mais uma vez!
Instalei o SQL SERVER 2008, mas não consigo criar a base de dados aí. Pode-me ajudar?
João Carvalho
Não consegue como? Dá erro?
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
À 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
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
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.
http://www.portugal-a-programar.org/forum/index.php/topic,53022.0.html
Não consigo passar disto....
Joao Carvalho
Muito bom, só no caso do sqlServerCompact, a função 'HasRows' não é suportada.
Enviar um comentário