Monthly Archives: Juliol 2014

Connexió a una base de dades SqlServer amb VB.net

Amb aquest post explicaré com realitzar una connexió a una base de dades SqlServer amb VB.net mitjançant OLEDB.

Base de dades SqlServer

Microsoft SQL Server és un sistema per a la gestió de bases de dades produït per Microsoft basat en el model relacional. Microsoft SQL Server constitueix l’alternativa de Microsoft a altres potents sistemes gestors de bases de dades com són Oracle, PostgreSQL o MySQL.

Per poder realitzar una connexió des VB.net, hem de preparar la base de dades amb un usuari i contrasenya i assignar els privilegis necessaris. Des de “SQL Server Management Studio” podem realitzar aquesta tasca d’una manera fàcil i senzilla.

Obrim “SQL Server Management Studio” i una vegada connectat al servidor afegim un nou inici de sessió, utilitzem la “Autenticació de SqlServer”, sobre la base de dades per defecte seleccionem la base de dades que vulguem connectar, també definim els permisos a la base de dades que utilitzarem en la connexió:

sqlserver-nuevo-inicio-sesion

Afegim un nou inici de sessió

permisos-base-datos-sqlserver

Definim els permisos que tindrà el nou usuari sobre la base de dades

Un cop acceptats els canvis ja tindrem llest el nou usuari per realitzar la connexió a la base de dades.

Connexió a una base de dades SqlServer amb VB.net

En primer lloc hem de realitzar les importacions de les classes que necessitem per fer la connexió a una base de dades SqlServer amb VB.net:

Imports System.Data
Imports System.Data.OleDb
Imports System.Data.SqlClient

Definim la connexió a la base de dades amb el nom del servidor, la base de dades i el usuari i la contrasenya que hem definit en SQLServer:

myConnectionString = "Provider=sqloledb;" & _
                     "Data Source=localhost;" & _
                     "Initial Catalog=bd-gaSQL;" & _
                     "User Id=UserPrueva;Password=contraseñaPrueva"

Anem a fer una consulta a la base de dades mitjançant un “Select”, la lectura de les dades de la consulta els llegim amb el OleDbDataReader:

        Try
            Dim s As String = ("SELECT * FROM Alumnes")
            connexio = New OleDbConnection(myConnectionString)
            myCommand = New OleDbCommand(s)
            myCommand.Connection = connexio
            connexio.Open()
            Dim myReader As OleDbDataReader = myCommand.ExecuteReader()
            While myReader.Read()
                Dim NOM As String = myReader("NOM")
                Dim COGNOM As String = myReader("COGNOM")
            End While
        Catch exc As Exception
            Throw New GestorExcepcio(exc.Message)
        End Try

Per afegir un nou registre ho podem fer mitjançant “Insert”:

        Try
            Dim sent As String = ("INSERT INTO Alumnes VALUES ('JORDI','NAVES')")
            Dim connexio As New OleDbConnection(myConnectionString)
            myCommand = New OleDbCommand(sent)
            myCommand.Connection = connexio
            connexio.Open()
            myCommand.ExecuteNonQuery()
            connexio.Close()
        Catch exc As Exception
            Throw New GestorExcepcio(exc.Message)
        End Try

I finalment per modificar un registre mitjançant un “update”:

        Try
            Dim s As String = ("UPDATE Alumnes SET nom='JORDI' Where id=1")
            connexio = New OleDbConnection(myConnectionString)
            myCommand = New OleDbCommand(s)
            myCommand.Connection = connexio
            connexio.Open()
            myCommand.ExecuteNonQuery()
            connexio.Close()
        Catch exc As Exception
            Throw New GestorExcepcio(exc.Message)
        End Try

En conclusió, una manera molt senzilla d’establir una comunicació entre SqlServer i Vb.net d’una manera ràpida i eficaç-

FB126 PNOIDIAG, Diagnòstic PROFINET o PROFIBUS

Un dels problemes que sorgeixen en treballar amb un autòmat S7 300 i amb un bus de comunicacions Profinet o Profibus, és el diagnòstic de la perifèria descentralitzada en temps real, encara que no tinguem una eina concreta per realitzar aquesta tasca, Siemens posa a disposició el FB126 PNOIDIAG, diagnòstic PROFINET o PROFIBUS, amb aquest FB podem realitzar un diagnòstic en temps real de la perifèria descentralitzada.

El FB126 realment llegeix directament sobre les dades de diagnòstic del PLC i anota els errors produïts per una caiguda del Bus de comunicacions.

Exemple del FB126 PNOIDIAG

En primer lloc hem de descarregar el programa FB 126 que ens proporciona Siemens a la següent adreça:

Descarga del FB126 PNOIDIAG, Diagnòstic PROFINET o PROFIBUS

Descomprimim i instal·lem el programa, després obrim l’administrador Simatic i en obrir projecte, en llibreries seleccionem PNIODiag:

abrir-fb126

Obrir projecte de FB126 de Diagnòstic

Depenent de la CPU que utilitzem hem d’utilitzar el FB126 que correspongui, amb blocs de més de 16K o amb blocs de menys de 16K, copiem el FB126 al nostre programa de Step 7

El següent pas seria crear un DB on guardarà l’estat del Bus, aquest DB l’hem de crear manualment segons aquesta estructura:

estructura-db-200

DB200, de diagnòstic dels esclaus del Bus

Podem veure en l’exemple que per cada estació utilitza 2 bytes d’informació, per tant hem de crear tants com estacions tinguem.

Seguidament hem de fer la crida al FB126 en els següents blocs, OB1, OB82, OB83, OB86 i OB100, cal recordar que perquè el diagnòstic funcioni correctament és important realitzar totes les crides:

llamada-fb126

En realitzar la crida, el programa ens demana un db d’instància per al FB126, aquí escollim el DB que vulguem, aquest DB simplement és de treball i d’ús intern del FB.

Un cop carregat els blocs modificats, ja tindrem llest el diagnòstic del bus, PROFINET O PROFIBUS, o fins i tot tots dos alhora.

Connexió entre client i servidor amb vb.net

En aquest post explicaré com fer una connexió entre client i servidor amb vb.net amb el sistema de comunicació de l’espai de noms System.Runtime.Remoting.Channels, aquest conté les classes que admeten i controlen els canals i els receptors de canals, que s’utilitzen com el mitjà de transport quan un client crida a un mètode en un objecte remot.

Aquest sistema ens serà especialment útil si volem fer aplicacions entre client i servidor que vulguem que el servidor faci les tasques de control i accés a la base de dades, és a dir el client en aquest cas simplement realitza les peticions al programa servidor, i el programa servidor rep les peticions i realitza les gestions corresponents a la base de dades.

Per realitzar una connexió entre client i servidor amb vb.net, hem de crear 3 projectes amb vb.net, El client, el servidor i la DLL que conté tots els objectes i les trucades del programa.

Primer programa, generació de la dll

El primer programa és l’encarregat de generar la dll que s’utilitzà tant en el programa client com en el programa servidor, aquí hem de programar les classes d’identitat, les classes d’accés a la base de dades i especialment les classes de recepció de peticions (el client crida a un mètode en un objecte remot)

Exemple de classe de recepció de peticions:

Public Class loginAction
    Inherits MarshalByRefObject
    Public Function validaUsuari(ByVal nomUsuari As String, ByVal contrasenya As String) As usuari
        Try
            Dim gestorUsuari As GestorUsuari = New GestorUsuari
            Dim usuari As usuari = gestorUsuari.validarUsuari(nomUsuari, contrasenya)
            Dim dataentrada As Date = Date.Today
            Dim horaentrada As TimeSpan = Date.Now.TimeOfDay
            Dim logEntrada As logEntrada = New logEntrada(0, usuari.getIdUsuari, _
            usuari.getNomCognoms, dataentrada, horaentrada)
            Me.altaLogEntrada(logEntrada)
            Return usuari
        Catch EXc As AccioExcepcio
            Throw New AccioExcepcio(EXc.Message)
        End Try
    End Function
End Class

On “loginAction” és la classe en aquest cas encarregada de comprovar la validació d’un usuari i la seva contrasenya, veiem com hem d’heretar de la classe “MarshalByRefObject”, el mètode que utilitzà el programa client per realitzar la validació es diu “validaUsuari” i aquest retorna un objecte “usuari” si la connexió té èxit. Podem realitzar més d’un mètode per classe i altres classes per rebre peticions remotes dins del nostre programa.

Segon programa, programa servidor

El programa servidor i que s’executa a l’ordinador servidor, serà l’encarregat de rebre les trucades dels clients i retornar la informació que el client sol·liciti.

En primer lloc el programa servidor ha d’incorporar una referència a la dll del primer programa que hem creat, per tant en l’apartat de referències triem la dll corresponent.

El programa servidor pot ser un senzill “form” amb algunes particularitats, primerament crearem un arxiu xml amb els serveis que hem creat en el primer programa o dll, aquest fitxer l’anomenarem “Listener.exe.config”

Listener

On el servei “loginAction” és efectivament la classe que havíem creat en el primer programa, podem veure que el port utilitzat per defecte és el 8085.

Després en el programa servidor hem d’importar les referències de l’espai de noms System.Runtime.Remoting.Channels

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels
Imports System.Runtime.Remoting.Channels.Tcp 

Després dins del programa creem les següent connexió:

    Public Sub activar()
        Try
            Dim aPath As String
            Dim aName As String
            aName = _
              System.Reflection.Assembly.GetExecutingAssembly. _
              GetModules()(0).FullyQualifiedName
            aPath = System.IO.Path.GetDirectoryName(aName)
            RemotingConfiguration.Configure(aPath & "\Listener.exe.config", False)
        Catch ex As Exception
            MsgBox(ex.Message)
        End Try
    End Sub
 

Aquí podem veure com carreguem la connexió del fitxer “listener.exe.config”, una vegada realitzada la configuració i activada la connexió el servidor queda preparat per a rebre les peticions del client.

Tercer programa, Programa client

El programa client és l’encarregat de realitzar les peticions al servidor, invocant els mètodes remots, igualment que hem fet amb el programa servidor hem d’afegir una referència a la dll creada en el primer programa, per tant en l’apartat de referències triem la dll corresponent.

Aquí també hem de crear un xml amb els serveis o classes que hem creat en el primer programa o dll, aquest fitxer l’anomenarem “Client.exe.config”, destacar aquí que hem d’especificar l’adreça IP del servidor, en aquest exemple és la de localhost perquè client i servidor són al mateix ordinador.

client-listener

Després en el programa client igualment que havíem fet al servidor hem d’importar les referències de l’espai de noms System.Runtime.Remoting.Channels

Imports System.Runtime.Remoting
Imports System.Runtime.Remoting.Channels

Després tenim que obrir la connexió abans de fer la trucada a un objecte remot, per obrir la connexió es fa d’una manera semblant com hem fet al servidor

RemotingConfiguration.Configure(aPath & "\Client.exe.config", False)

Ara si que podem fer la trucada a l’objecte remot des de l’aplicació client, en l’exemple utilitzem el mètode que havíem creat en el primer programa dll


    Private Sub acceptar()
        Dim loginAction As New loginAction
        usuari = loginAction.validaUsuari(UseTextBox.Text, PassTextBox.Text)
    End Sub 

Conclusions

A partir d’aquest exemple es poden crear tots els mètodes remots que vulguem, sempre respectant l’ordre, primer al programa dll, i després al servidor.

És una manera senzilla de separar el client del servidor i que els programes client no hagin de realitzar tasques directament amb la base de dades, d’aquesta manera el tràfic de dades també és menor ja que moltes operacions es poden realitzar en el programa servidor.