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

VS2010 RC1: Implicit Line Continuation

Quando uma linha de código é demasiado extensa, é necessário muitas vezes saltar de linha, de modo a que o código fique todo visível e seja mais simples de interpretar. Para o fazer é usado um “_” (underscore):


    MessageBox.Show("Isto é um teste", _
                    My.Application.Info.Title, _
                    MessageBoxButtons.OK, _
                    MessageBoxIcon.Warning)

Ora isto é algo que no Visual Studio 2010 deixou de ser necessário, podendo agora ser utilizado:


    MessageBox.Show("Isto é um teste",
                    My.Application.Info.Title,
                    MessageBoxButtons.OK,
                    MessageBoxIcon.Warning)

Obviamente que isto não pode ser efectuado em todas as situações, pois o compilador precisa de saber identificar se estamos a saltar de linha ou a iniciar uma nova instrução.

Estas são algumas das situações onde é possível o fazer:

  • Após uma virgula “,”
  • Após um parêntese aberto “(“ ou antes de um fechado “)”
  • Após uma chaveta recta “{“ ou antes de uma chaveta recta “}”
  • Após uma concatenação “&”
  • Após uma atribuição “=, &=, :=, +=, -=, *=, /=, \=, ^=, <<=, >>=”
  • Após um operador binário “+, -, /, *, Mod, <>, <, >, <=, >=, ^, >>, <<, And, AndAlso, Or, OrElse, Like, Xor”
  • Após um operador Is ou IsNot

Entre muitas outras situações, como LINQ, XML Literals, etc.

Mais uma melhoria com o objectivo de simplificar a vida ao programador!


VS2010 RC1: Auto-Implemented Properties

As Auto-Implemented Properties são uma forma simples e rápida de definir uma propriedade, sem a utilização do Get e Set. Esta opção já estava disponível no C# 3.0 e passou agora a fazer parte do VB10.

Podemos agora fazer(auto-implemented property):


  Public Property myProp As String

Em vez de(expanded property):


  Private _myPror As String
  Public Property myPror() As String
    Get
      Return _myPror
    End Get
    Set(ByVal value As String)
      _myPror = value
    End Set
  End Property

No entanto pode-se sempre usar o método “normal”(expanded property), caso seja necessário adicionar código nos métodos Get e Set, caso seja uma propriedade WriteOnly ou ReadOnly, etc.

Quando é definida uma auto-implemented property, é criado internamente (não visível) um backing field, ou seja, se a propriedade for designada como “myProp”, será criada uma variável “_myProp”. Isto quer dizer, que se tentarmos criar uma variável com o mesmo nome, iremos ter o seguinte erro:

property 'myProp' implicitly defines '_myProp', which conflicts with a member of the same name in class 'Form1'

Podemos ainda inicializar a propriedade por mais complexa que seja a expressão:


  Public Property myProp1 As String = "vbtuga"
  Public Property myProp2 As Integer = 123
  Public Property myProp3 As List(Of Integer) = Enumerable.Range(0, 20).ToList
  Public Property myProp4() As String = New String({"a", "b", "c"})

Sem dúvida vem ajudar a simplificar o código!


Visual Studio 2010: VB.NET vs C#

Com o lançamento da versão Visual Studio 2010 Release Candidate e com o lançamento da versão final à vista, existem obviamente um conjunto de novidades do Visual Studio 2010 e da plataforma .NET Framework 4.

Estas novidades vêm aproximar ainda mais o VB.NET e o C#, pois algumas das coisas que estavam disponíveis apenas no VB.NET, estão agora disponíveis no C# (como os Optional Parameters), e algumas das coisas que estavam apenas disponíveis no C#, estão agora disponíveis no VB.NET (como as Auto-Implemented Properties ou as Multiline Lambda Expressions).

Luca Bolognese, Principal Group Program Manager para as linguagens C#, VB e F#, compiladores e IDEs , fala no Channel 9 sobre C# and VB.NET Co-Evolution, onde refere que as duas linguagens estão cada vez mais próximas e que no desenvolvimento de novas versões, irão ser implementadas novidades em ambas as linguagens e não apenas em uma ou outra. Esta versão do Visual Studio é o resultados disso mesmo!

Existem diversas aplicações online e offline que garantem a conversão de grande parte do código e, com as alterações que juntam cada vez mais as duas linguagens, a taxa de sucesso na conversão será ainda maior.

Podemos deste modo crer, que em edições futuras poderá ser possível mudar a linguagem da aplicação, dentro do próprio Visual Studio, ou seja, poderemos ter programadores de VB.NET e C# a trabalhar na mesma aplicação.

Isto poderia até ser relevante para o mercado de trabalho, uma vez que não existiriam vagas para um programador de VB ou para um programador de C#, mas sim para um programador da plataforma .NET. Será isto possível no futuro próximo? Será isto uma realidade nas próximas versões? O futuro o dirá!

Os próximos artigos deste blog irão focar algumas das novidades do Visual Studio 2010, algumas mais simples e algumas mais complexas, mas sempre em VB.NET!


VB.NET: Classe SqlTransaction

Esta classe, SqlTransaction(), não é uma novidade das últimas versões da plataforma .NET, mas mesmo assim, não é usada por muitos programadores, sendo ela tão útil para comandos T-SQL dependentes.

Numa perspectiva geral, é criado um objecto SqlTransaction() chamando o método BeginTransaction() da classe SqlConnection(). A partir daqui, todas as operações são efectuadas na SqlTransaction() e, chamando o método Commit(), irá tentar executar todas as operações na base de dados SQL. Caso não consiga, pode-se então chamar o método Rollback() que irá tentar anular todas as alterações planeadas.

Imaginemos que queremos inserir os dados de um formulário em tabelas diferentes, ou seja, alguns dados vão para uma tabela e outros dados para outra(s) tabela(s). Estes dados têm de estar relacionados(ID) caso contrário não existe correspondência entre eles. O facto de não se conseguir escrever em qualquer uma das tabelas, pode assim comprometer a integridade dos dados.

Fica aqui um pequeno exemplo de como podemos evitar este problema:

    Dim connString As String = "connection string de ligação ao SQL"
    Dim transaction As SqlClient.SqlTransaction = Nothing

    ' Ligação à base de dados
    Using conn As New SqlClient.SqlConnection(connString)
      conn.Open()

      Try

        ' Define o comando e a transacção
        Using command As SqlClient.SqlCommand = conn.CreateCommand()
          transaction = conn.BeginTransaction


          ' Faz diversas operações em diferentes tabelas, usando
          ' comandos T-SQL(UPDATE e INSERT), StoredProcedures, etc
          With command

            ' Define a ligação e transacção para o SqlCommand
            .Connection = conn
            .Transaction = transaction


            ' ---------------------------------------------------------
            ' Actualiza a 1ª tabela (Tabela 1)
            ' ---------------------------------------------------------
            .CommandType = CommandType.Text
            .CommandText = "UPDATE tabela1 SET anulado=1 WHERE id=@id;"
            .Parameters.Add("@id", SqlDbType.Int).Value = 123
            .ExecuteNonQuery()
            .Parameters.Clear()


            ' ---------------------------------------------------------
            ' Insere a 2ª tabela (Tabela 2) neste caso através
            '  de um StoredProcedure e o método ExecuteScalar()
            ' ---------------------------------------------------------
            .CommandType = CommandType.StoredProcedure
            .CommandText = "sp_tabela2"
            .Parameters.Add("@a", SqlDbType.VarChar).Value = "abc"
            .Parameters.Add("@b", SqlDbType.VarChar).Value = "def"

            Dim lastID As Integer = Integer.Parse(.ExecuteScalar())
            .Parameters.Clear()


            ' ---------------------------------------------------------
            ' Insere na 3ª tabela (Tabela 3) usando o resultado anterior
            ' ---------------------------------------------------------
            .CommandType = CommandType.Text
            .CommandText = "INSERT INTO tabela3 (ID) VALUES (@ID)"
            .Parameters.Add("@ID", SqlDbType.Int).Value = lastID
            .ExecuteNonQuery()

          End With

          ' Tenta gravar as actualizações na base de dados
          transaction.Commit()

          MessageBox.Show("Actualização efectuada com sucesso!")
        End Using

      Catch ex As Exception

        Try

          ' Caso ocorra um erro tenta fazer o Rollback() ou
          ' seja, cancelar as modificações que estão pendentes
          transaction.Rollback()
          Exit Try

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

        ' Informação geral do erro, mas com as modificações já canceladas
        MessageBox.Show(ex.Message)

      End Try

    End Using
    transaction.Dispose()

 

Simples de utilizar, e muito útil, garantido desta forma que todas as transacções são efectuadas, e caso contrário, serão canceladas, não ficando assim, dados sem correspondência.




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