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

Visual Studio 2010 and .NET Framework 4 Release Candidate

Já está disponível desde dia 8 de Fevereiro, para quem tem uma subscrição MSDN, o Visual Studio 2010 and .NET Framework 4 Release Candidate. A versão pública, para quem não tem uma subscrição MSDN, vai estar disponível já no dia 10 de Fevereiro.

Para quem instalar o VS2010-RC, existe um questionário que a Microsoft agradece a participação. Pode ser preenchido no seguinte endereço: Instructions for Survey


VB.NET: Namespace Microsoft.VisualBasic

O Visual Basic.NET (VB.NET) é uma sucessão do Visual Basic 6.0 (VB6) e por uma questão de compatibilidade, e facilidade de migração dos programadores e das aplicações, muitas das funções e objectos, que estavam disponíveis no VB6, estão também disponíveis no VB.NET.

Estas funções e objectos estão agrupadas no namespace Microsoft.VisualBasic e fazem parte do conjunto de referências base de cada projecto, ou seja, quando é criado um novo projecto, já existe uma referência a este namespace, que poderá ser utilizado em todo o projecto.

Existem no entanto alternativas para essas funções e objectos, que estão disponíveis em alguns namespaces da plataforma .NET.

Por uma questão de boas práticas de programação é bom utilizar as funções e objectos mais recentes, pois estas são as que irão prevalecer (nunca se sabe se as outras serão descontinuadas e removidas de edições futuras).

Para desactivar esta referência do projecto e obrigar desta forma à utilização dos novos métodos (pessoalmente recomendo que se faça), pode-se fazer o seguinte:

1 - Duplo clique em My Project ou menu Project – Properties
2 - Seleccionar a TAB References. Aqui estão as referências que estão adicionadas ao projecto.

Podemos ainda, e dentro das referências, clicar em “Unused References” para verificarmos que referências não estão a ser utilizadas no nosso projecto. Isto não irá reduzir o tamanho do ficheiro mas reduzirá o número de dependências do projecto.

3 - Finalmente, nos namespaces importados para o projecto, retiramos a selecção do namespace Microsoft.VisualBasic.

Isto irá obrigar a usar as novas funções no projecto!

Além disso existem funções que estão disponíveis em diferentes namespaces e que poderão provocar alguns problemas, como é o caso de Left(), Len(), etc.

 
Alguns exemplos de conversão funções de VB6 para VB.NET

Formatar números:

        ' VB6
        Dim num As Integer = 12345
        Debug.WriteLine(Format(num, "#,00"))

        ' VB.NET
        Dim num As Integer = 12345
        Debug.WriteLine(num.ToString("#,00"))

Retirar X caracteres à esquerda:

        ' VB6
        Dim num As Integer = 12345
        Debug.WriteLine(Microsoft.VisualBasic.Left(num, 2))

        ' VB.NET
        Dim num As Integer = 12345
        Debug.WriteLine(num.ToString.Substring(0, 2))

Retirar X caracteres do meio de uma string:

        ' VB6
        Dim num As Integer = 12345
        Debug.WriteLine(Microsoft.VisualBasic.Mid(num, 1, 1))

        ' VB.NET
        Dim num As Integer = 12345
        Debug.WriteLine(num.ToString.Substring(0, 1))

Verifica qual o código ascii de um caracter:

        ' VB6
        Debug.WriteLine(Asc("A"))

        ' VB.NET
        Debug.WriteLine(Convert.ToByte("A"c))

Converte um código ascii no seu caracter:

        ' VB6
        Debug.WriteLine(Chr(65))

        ' VB.NET
        Debug.WriteLine(Convert.ToChar(65))

Mostra a data/hora actual:

        ' VB6
        Debug.WriteLine(Now.ToString)

        ' VB.NET
        Debug.WriteLine(DateTime.Now.ToString)

Mostra uma mensagem no ecrã:

        ' VB6
        MsgBox("teste!")

        ' VB.NET
        MessageBox.Show("teste!")

Converte para Inteiro:

        ' VB6
        Debug.WriteLine(CInt("123"))

        ' VB.NET
        Debug.WriteLine(Integer.Parse("123"))

Converte para String:

        ' VB6
        Dim num As Integer = 12345
        Debug.WriteLine(CStr(num))

        ' VB.NET
        Dim num As Integer = 12345
        Debug.WriteLine(num.ToString)

Verifica se uma expressão é numérica:

        ' VB6
        Dim num As String = "12345"
        If IsNumeric(num) Then
            ' verdadeiro
        End If

        ' VB.NET
        Dim num As String = "12345"
        Dim result As Integer
        If Integer.TryParse(num, result) Then
            ' verdadeiro e a variável result
            ' fica com o resultado em inteiro
        End If

Verifica se uma expressão é uma data válida:

        ' VB6
        Dim data As String = "5-2-2010"
        If IsDate(data) Then
            ' verdadeiro
        End If

        ' VB.NET
        Dim data As String = "5-2-2010"
        Dim dt As DateTime
        If DateTime.TryParse(data, dt) Then

            ' verdadeiro e a variável dt
            ' fica com o resultado como DateTime
        End If

Existem muitos mais exemplos, mas estes servem para mostrar algumas das formas de como podemos substituir as antigas funções do VB6 e começar a programar à “.NET way”

Espero que ajude!


Reorganização no Visual Basic Learning Center


Foram reorganizados alguns dos recursos de Visual Basic no Visual Basic Developer Center Learn Pages. Estes recursos, nomeadamente as páginas Introductory Topics e Language Syntax estão agora organizados de forma a ser mais simples a navegação e mais acesso rápido à informação.

Na página Introductory Topics podemos encontrar alguns links sobre o Visual Studio e alguns links fundamentais para a iniciação na linguagem.

Na página Language Syntax, bastante mais completa, podemos encontrar como tópicos principais os seguintes pontos (com os respectivos sub-tópicos):

  • Coding in Visual Basic
  • Language Keywords
  • Data Types
  • Object-Oriented Programming
  • Handling Errors
  • Commenting your Code
  • Simplifying Common Programming Tasks
  • Working with Strings
  • Working with the File System
  • Working with XML
  • Working with Data
  • Language Integrated Query (LINQ)

Está ainda disponível, e já à algum tempo, um endereço mais simples de decorar para a Central de Recursos de Visual Basic no MSDN - http://msdn.com/vbasic.


VB.NET: Classe SqlBulkCopy

A plataforma .NET permite implementar de uma forma muito simples um BULK INSERT em uma base de dados SQL, ou seja, importar dados de uma fonte de dados (base de dados, arquivo de texto, XML, etc) e gravar numa tabela SQL. Este método é muito prático e com ganhos significativos em termos de eficiência para diversas operações como a migração de dados, inserção de muita informação, etc. Esta operação também é possível de se fazer, e para não é familiar com o termo BULK INSERT, utilizando comandos Transact-SQL.

Para mostrar como utilizar a classe SqlBulkCopy, e como pode ser útil, será mostrado um pequeno exemplo de migração de dados de Access para SQL.

Deve-se verificar se o mapeamento entre colunas está correcto (podem-se utilizar os nomes da colunas em vez do seu índice) e se o tipo de dados das colunas de origem é ser suportado nas colunas de destino (não gravar strings em integers por exemplo). Podem ser utilizadas apenas algumas colunas.

O que o seguinte código faz é ler a informação de uma tabela de Access para um DataSet (que ficará numa DataTable) e depois, usando o SqlBulkCopy, gravar essa informação na tabela de destino no SQL.

Lê a informação do Access, da tabela tblOrigem:

        Dim connStringAccess As String = _
            "Provider=Microsoft.Jet.OLEDB.4.0;" & _
            "Data Source=c:\DadosOrigem.mdb;" & _
            "Jet OLEDB:Database Password=teste;"

        ' Lê a informação da tabela do Access para um DataSet
        Dim ds As New DataSet
        Dim SQL As String = "SELECT * FROM tblOrigem"
        Using da As New OleDb.OleDbDataAdapter(SQL, connStringAccess)
            da.Fill(ds)
        End Using

Grava no SQL, na tabela tblDestino, com base na informação anterior:

        Dim connStringSQL As String = _
            "Data Source=<Servidor>;" & _
            "Integrated Security=False;" & _
            "User ID=teste;Password=teste"

        ' Cria uma ligação ao servidor SQL
        Using conn As New SqlClient.SqlConnection(connStringSQL)
            conn.Open()

            Using copy As New SqlClient.SqlBulkCopy(conn)

                ' Irá mostrar o total de registos copiados
                AddHandler copy.SqlRowsCopied, AddressOf SqlRowsCopiedEvent

                ' Faz o mapeamento das tabelas em que, por  
                ' exemplo, a coluna 2 da tabela de origem irá   
                ' ser escrita na coluna 3 da tabela de destino
                copy.ColumnMappings.Add(0, 0)
                copy.ColumnMappings.Add(1, 1)
                copy.ColumnMappings.Add(2, 3)
                copy.ColumnMappings.Add(3, 2)

                ' Indica a tabela de destino
                copy.DestinationTableName = "tblDestino"

                Try

                    ' Escreve no SQL
                    copy.WriteToServer(ds.Tables(0))

                Catch ex As Exception
                    MessageBox.Show(ex.Message)
                End Try

            End Using
        End Using

Finalmente a informação do total de registos copiados:

    Sub SqlRowsCopiedEvent(ByVal sender As Object, _
                       ByVal e As System.Data.SqlClient.SqlRowsCopiedEventArgs)

        MessageBox.Show("Registos copiados: " & e.RowsCopied.ToString)

    End Sub

Neste caso o número de registo que irá mostrar será o total, porque não foi definido um BatchSize (que indica o número de registos que irá copiar). Definindo um BatchSize (por exemplo copy.BatchSize = 100), poder-se-ia utilizar este evento para animar uma ProgressBar e mostrar a evolução do processo, sendo obviamente, o processo um pouco mais lento desta forma.

Nota: Como curiosidade, e numa migração recente em que utilizei este método, a migração de uma tabela de Access com 260.000 registo para SQL, demorou aproximadamente 6 segundos.

Mas esta classe pode ter mais aplicação, como por exemplo, inserir no SQL um grande número de registo. Pode-se criar uma tabela, carregar os dados e finalmente inserir todos os registos de uma vez (sem várias chamadas à base de dados).

Por exemplo:

        Dim dt As New DataTable("Origem")
        dt.Columns.Add("ID", GetType(Integer)).AutoIncrement = True
        dt.Columns.Add("numero", GetType(Integer))
        dt.Columns.Add("nome", GetType(String))
        dt.Columns.Add("data", GetType(DateTime))

        Dim dr As DataRow = dt.NewRow
        dr.Item("numero") = 1
        dr.Item("nome") = "Jorge Paulino"
        dr.Item("data") = DateTime.Now
        dt.Rows.Add(dr)

        Dim ds As New DataSet
        ds.Tables.Add(dt)


E depois repetir o mapeamento e a inserção usando a classe SqlBulkCopy.

Espero que ajude!




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