VB .NET - Consultando o SQL Server a partir do MonthCalendar (DateSelected)


 No artigo de hoje vou mostrar como podemos vincular uma data selecionada no controle MonthCalendar com informações armazenadas em uma tabela do SQL Server.

A classe MonthCalendar representa o controle MonthCalendar do VB .NET e no artigo VB.NET - Usando o controle MonthCalendar - Macoratti.net eu abordei as principais propriedades e métodos deste controle.

Neste artigo eu vou mostrar como podemos acessar informações de uma tabela do SQL Server e exibi-las em um controle DataGridView com base em datas selecionadas em um controle MonthCalendar.

O evento DateSelected ocorre quando o usuário realizar a seleção de uma data no controle MonthCalendar.

Em nosso exemplo vamos usar esse evento para permitir ao usuário selecionar uma data e com base nesta data vamos recuperar informações de uma tabela do SQL Server.

Para capturar a data selecionada vamos usar a propriedade SelectionRange que obtém ou define o intervalo de datas para um controle de calendário do mês selecionado.

Assim para obter a data inicial selecionada podemos usar o seguinte código :  MonthCalendar1.SelectionRange.Start

As consultas serão realizadas usando o banco de dados Cadastro.mdf criado no SQL Server e a tabela Alunos que tem a seguinte estrutura:

USE [Cadastro]
GO
CREATE TABLE [dbo].[Alunos](
	[Id] [int] IDENTITY(1,1) NOT NULL,
	[Nome] [nvarchar](50) NOT NULL,
	[Email] [nvarchar](100) NULL,
	[Idade] [int] NULL,
	[DataInscricao] [datetime] NULL,
	[Sexo] [nchar](1) NULL,
 CONSTRAINT [PK__Alunos__15502E78] PRIMARY KEY CLUSTERED 
(
	[Id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY]
GO

Observe que o campo DataInscricao é do tipo DateTime.

Nota: Ao lado temos o script para criar a tabela no SQL Server Management Studio

Para testar inclui alguns dados na tabela conforme abaixo:


 

Vamos usar a coluna DataInscricao para realizar a consulta de dados na tabela comparando-a com a data selecionada no MonthCalendar pelo usuário.

 

Recursos usados :

Criando o projeto no VS 2013 Express Edition

Abra o VS 2013 Express for Windows desktop e clique em New Project;

A seguir selecione Visual Basic -> Windows Forms Application;

Informe o nome ConsultaDados_Agenda e clique no botão OK;

No formulário form1.vb vamos incluir os seguintes controles a partir da ToolBox:

Disponha os controles no formulário conforme o leiaute da figura abaixo:

Vamos criar uma classe que será responsável pela conexão com o banco de dados e pela consulta a tabela no SQL Server retornando um objeto DataTable que iremos exibir no controle DataGridView.

Nota: Para ficar mais aderente ás boas prática o correto seria criar um outro projeto que funcionaria como uma camada de acesso a dados. Também não criamos uma camada de negócios o que é sempre indicado quando acessamos um banco de dados.

No menu PROJECT clique em Add Class e informe o nome AcessoBD e clique no botão Add.

A seguir inclua o código abaixo nesta classe:

Imports System.Configuration
Imports System.Data.SqlClient
Imports System.Data

Public Class AcessoBD

    Private Shared Function GetDbConnection() As SqlConnection
        Try
            Dim conString As String = ConfigurationManager.ConnectionStrings("conexaoAlunoSQLServer").ConnectionString
            Dim connection As SqlConnection = New SqlConnection(conString)
            connection.Open()
            Return connection
        Catch ex As Exception
            Throw ex
        End Try
    End Function

    Public Overloads Shared Function GetDataTable(ByVal sql As String) As DataTable
        Try
            Using connection As SqlConnection = GetDbConnection()
                Using da As New SqlDataAdapter(sql, connection)
                    Dim table As New DataTable
                    da.Fill(table)
                    Return table
                End Using
            End Using
        Catch
            Throw
        End Try
    End Function
End Class

Nossa classe é bem enxuta e possui apenas dois métodos estáticos (Shared) :

Para este código funcionar temos que incluir a string de conexão do banco de dados no arquivo App.Config:

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <startup>
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.5" />
    </startup>
  <connectionStrings>
    <add name="conexaoAlunoSQLServer" connectionString="Data Source=.\SQLEXPRESS;Initial Catalog=Cadastro;Integrated Security=True"/>
  </connectionStrings>
</configuration>

Vamos ter que incluir também uma referência no projeto ao namespace System.Configuration.

No menu PROJECT clique em Add Reference e marque o item System.Configuration na janela Reference Manager:

Agora podemos retornar ao nosso formulário form1.vb e definir duas variáveis no início do formulário:

Dim data As String
Dim sql As String

Após isso defina o código abaixo no evento DateSelected do controle MonthCalendar :

 Private Sub MonthCalendar1_DateSelected(sender As Object, e As DateRangeEventArgs) Handles mCalendario.DateSelected
        Try
            data = mCalendario.SelectionStart.ToString
            sql = "Select Id, Nome, Email, DataInscricao from Alunos where DataInscricao = '" & DateTime.Parse(data).ToString("M/d/yyyy") & "' Order By DataInscricao"
            dgvDados.DataSource = AcessoBD.GetDataTable(sql)
        Catch ex As Exception
            MessageBox.Show("Erro :" + ex.Message, "Erro", MessageBoxButtons.OK, MessageBoxIcon.Error)
        End Try
End Sub

 

Vamos entender o código :

 

1- Obtemos a data selecionada pelo usuário a partir da propriedade SelectionStart do MonthCalendar:  data = mCalendario.SelectionStart.ToString

 

2 - Montamos a consulta SQL onde selecionamos o Id,Nome,Email e DataInscricao da tabela Alunos onde o campo DataInscricao deve ser igual à data selecionada no MonthCalendar e ordenamos o resultado pelo campo DataInscricao:

 

  sql = "Select Id, Nome, Email, DataInscricao from Alunos where DataInscricao = '" & DateTime.Parse(data).ToString("M/d/yyyy") & "' Order By DataInscricao"
 

O detalhe na montagem da instrução SQL é que o formato da data obtida tem que ser mm/dd/yyyy e tem que estar entre aspas simples (').

 

Por isso tivemos que converter a data obtida para esse formato : DateTime.Parse(data).ToString("M/d/yyyy")


Note que na tabela Alunos o campo DataInscricao é do tipo DateTime e os valores inseridos estão no formato dd/mm/yyyy 00:00:00; minhas configurações regionais estão definidas para o formato dd/mm/yyyy.

 

Observe que a data selecionada no calendário foi obtida como string e armazenada na variável data do tipo string.

Executando o projeto e realizando algumas operações iremos obter:

1- Selecionando qualquer data no calendário igual ao campo DataInscricao da tabela Alunos teremos o registro exibido no DataGridView :

Você pode incrementar o código permitindo ao usuário criar vários tipos de consultas por data.

Pegue o projeto completo aqui:  ConsultaDados_Agenda.zip

E Jesus lhes disse: Eu sou o pão da vida; aquele que vem a mim não terá fome, e quem crê em mim nunca terá sede.
João 6:35

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

  Gostou ?   Compartilhe no Facebook   Compartilhe no Twitter

Referências:


José Carlos Macoratti