Archive for the ‘Codice’ category

Programming the Task Bar in Windows 7 with WPF 4

June 30th, 2010

Interessantissimo articolo scritto da Alessandro Del Sole su come programmare la TaskBar in W7 con WPF.
Qui la prima parte
Qui la seconda

Complimenti Alessandro ;)

Windows 7 RTM: prime impressioni e qualche problema

August 9th, 2009

Week-End interamente dedicato all’istallazione di Windows 7 RTM su tutte le workstation e portatili di casa. Come già appurato nelle precedenti versioni beta e la RC Windows 7 è un sistema molto più stabile e molto meno esigente di risorse. Questo si traduce in una maggiore velocità di utilizzo e piacevolezza nello spostarsi tra un’applicazione e l’altra.

windows7

Fin qui nessun problema tranne quando non mi sono imbattuto in qualche problema abbastanza serio per chi, come me, sviluppa anche applicazioni per Windows Mobile:

Eseguendo Cellular Emulator sul mio portatile (sul quale ho installato il sistema X64) mi vedo venir fuori questo errore:

imageGirando sul forum MSDN vedo che l’emulatore non è supportato dal sistema operativo in questione!!! ARGHHHHH!!!!!
Bene, dopo la breve incazzatura decido di mettere su la “WINDOWS XP MODE” che permette di virtualizzare Windows XP su Windows 7 in tempi rapidissimi ma nel momento in cui lancio la macchina virtuale:

imageil problema è dovuto al fatto che sulla mia macchina non è possibile attivare lato bios la virtualizzazione hardware e Windows Virtual Pc non può farne a meno!!
Risultato: sul mio portatile sarò costretto ad installare Windows 7 32 bit o crearmi una macchina virtuale con  VMWare :(

Diagrams on Sql Server 2005

September 17th, 2008

Ad una nuova installazione di Sql Server e quando faccio l’attach di un DB proveniente da Sql 2000 ho sempre il solito errore nel momento in cui cerco di aprire i diagrammi:
“Database diagram support objects cannot be installed because this database does not have a valid owner. To continue, first use the Files page of the Database Properties dialog box or the ALTER AUTHORIZATION statement to set the database owner to a valid login, then add the database diagram support objects.”

Vi posto il codice da eseguire per ovviare a questo fastidioso problema che non viene via nemmeno impostando la compatibilità su Sql 2005 nelle option del DB

use [master] EXEC sp_dbcmptlevel 'TuoDatabase', '90';
go
ALTER AUTHORIZATION ON DATABASE::TuoDatabase TO tuoLogin
go
use [TuoDatabase]
go
EXECUTE AS USER = N'dbo' REVERT
go
 
Spero vi sia utile ;) 

Encrypting with Rfc2898DeriveBytes

April 29th, 2008

A chi non è mai venuto in testa di crittare i propri dati in maniera abbastanza sicura? A me di certo capita tutti i giorni. Spero che questo breve tutorial possa aiutarvi a realizzare una encription abbastanza potente:

Vi allego la classe pronta all’utilizzo:

StringsExtensions.zip

Vi basterà importarla nel vostro codice:

Imports
WindowsApplication1.StringExtensions

ed utilizzare i metodi in questo modo:

Dim stringaDaCrittare = "Ciao Gaetano"
Dim stringaCrittata As String
stringaCrittata = stringaDaCrittare.Trim.CryptFromString("gaetano")

In questo modo abbiamo crittato la nostra stringa “stringaDaCrittare” con il metodo Rfc2898DeriveBytes messo a disposizione già dal Framework 2.0. Il metodo “CryptFromString” necessita si una password di crittazione assegnata ogni volta dall’utente (password di crittaggio e decrittaggio devono coincidere ovviamente)

Dim stringaCrittata = "A8 B4 C9 F1 A2"
Dim stringaDaDecrittare As String
stringaDaDecrittare = stringaCrittata.Trim.DecryptFromString("gaetano")

…qualora voleste decrittare una stringa precedentemente crittata con lo stesso metodo (e password!)

Semplice no?

Riferimenti alla classe “Rfc2898DeriveBytes” qui

Crystal Reports e passaggio di parametri a report e sottoreport

April 23rd, 2008

Con il seguente codice avrete la possibilità di gestire l’autenticazione del report principale e di tutti i sottoreport da esso richiamati, oltre alla possibilità di passare eventuali parametri impostati nel report (nell’esempio vengono letti da quarystring, ma potrebbero benissimo essere parametri di session…). Il mio problema era proprio quello di settare i parametri di connessione dei singoli sottoreport. E’ la funzione “SetDBLogonForSubreports” che svolge questo compito.

Spero possa esservi di aiuto: (prerequisiti: Visual Studio 2005 e CrystalReports)

Imports CrystalDecisions.CrystalReports.Engine
Imports CrystalDecisions.Shared
Imports System.IO

Partial Class _Default
    Inherits System.Web.UI.Page
    Private MyReport As ReportDocument
    Private Sub ConfigureCrystalReports()

        'carico il report
        MyReport = New ReportDocument()
        Dim reportPath As String = Server.MapPath("TuoReportMaster.rpt")
        MyReport.Load(reportPath)

        'passo i parametri di connessione al report
        Dim myConnectionInfo As ConnectionInfo = New ConnectionInfo()

        'parametri presenti nel webconfig
        myConnectionInfo.DatabaseName =
        System.Configuration.ConfigurationManager.AppSettings("Database")
        myConnectionInfo.UserID =
        System.Configuration.ConfigurationManager.AppSettings("UserName")
        myConnectionInfo.Password =
        System.Configuration.ConfigurationManager.AppSettings("Password")
        myConnectionInfo.ServerName =
        System.Configuration.ConfigurationManager.AppSettings("Server")

        'autentico il mio report principale
        SetDBLogonForReport(myConnectionInfo, MyReport)

        'autentico tutti i sottoreport richiamati dal report principale
        SetDBLogonForSubreports(myConnectionInfo, MyReport)

        'passo eventuali parametri al report principale
        Dim paramFields As New ParameterFields()
        Dim discreteVal As New ParameterDiscreteValue()
        Dim parametro1 As New ParameterField()
        Dim parametro2 As New ParameterField()

        'passo il primo parametro
        parametro1.ParameterFieldName = "@Parametro1DelReport"
        discreteVal = New ParameterDiscreteValue()
        discreteVal.Value = Request.QueryString("Parametro1")
        'in questo caso leggo da una querysting
        MyReport.SetParameterValue("@Parametro1DelReport", discreteVal.Value)

        'passo il secondo parametro
        parametro2.ParameterFieldName = "@Parametro2DelReport"
        discreteVal = New ParameterDiscreteValue()
        discreteVal.Value = Request.QueryString("Parametro1")
        'secondo parametro anche passato in querysting
        MyReport.SetParameterValue("@Parametro1DelReport", discreteVal.Value)
    End Sub

    Private Sub SetDBLogonForReport(ByVal myConnectionInfo
                    As ConnectionInfo, ByVal myReportDocument As ReportDocument)
        'subroutine che setta i parametri di connessione del report principale
        Dim myTables As Tables = myReportDocument.Database.Table
        Dim myTable As CrystalDecisions.CrystalReports.Engine.Table
        For Each myTable In myTables
            Dim myTableLogonInfo As TableLogOnInfo = myTable.LogOnInfo
            myTableLogonInfo.ConnectionInfo = myConnectionInfo
            myTable.ApplyLogOnInfo(myTableLogonInfo)
        Next
    End Sub

    Private Sub SetDBLogonForSubreports(ByVal myConnectionInfo
                    As ConnectionInfo, ByVal myReportDocument As ReportDocument)
        'subroutine che setta i parametri di connessione di
        'tutti i sottoreport richiamati dal report principale
        Dim mySections As Sections = myReportDocument.ReportDefinition.Sections
        Dim mySection As Section
        For Each mySection In mySections
            Dim myReportObjects As ReportObjects = mySection.ReportObjects
            Dim myReportObject As ReportObject
            For Each myReportObject In myReportObjects
                If myReportObject.Kind = ReportObjectKind.SubreportObject Then
                    Dim mySubreportObject As SubreportObject =
                    CType(myReportObject, SubreportObject)
                    Dim subReportDocument As ReportDocument =
                    mySubreportObject.OpenSubreport mySubreportObject.SubreportName)
                    SetDBLogonForReport(myConnectionInfo, subReportDocument)
                End If
            Next
        Next
    End Sub

    Protected Sub Page_Load(ByVal sender As Object,
                                ByVal e As System.EventArgs) Handles Me.Load

        'richiamo i parametri di configurzione
        ConfigureCrystalReports()

        'esporto il report in pdf
        Dim oStream As New MemoryStream ' // using System.IO
        oStream = MyReport.ExportToStream
                        (CrystalDecisions.Shared.ExportFormatType.PortableDocFormat)
        Response.Clear()
        Response.Buffer = True
        Response.ContentType = "application/pdf"
        Response.BinaryWrite(oStream.ToArray())
        Response.End()
    End Sub

End Class

Se tutto è stato impostato correttamente dovreste vedere il vostro bel pdf saltare fuori :)

Modificare a Runtime l’impostazione della connectionString

April 19th, 2008

In questi giorni mi sono dedicato interamente allo sviluppo di un’applicazione client ed avevo l’esigenza di modificare continuamente da form la connessione al Database (sqlServer). Immaginate quanto sia seccante ogni volta andare nell’ app.config e cambiare ogni volta i parametri. Beh..ecco un trucchetto che potrebbe esservi utile per fare una cosa del genere a Runtime:

Ovviamente non abbiamo accesso in scrittura all’app.config quindi la prima cosa da fare è crearci una Property all’interno del namespace My in questo modo:

Public WriteOnly Property RunTimeConnectionString() As String
    Set(ByVal value As String)
        My.Settings("MiaConnectionString") = value
    End Set
End Property

Bene..ora nell’evento MySettings_PropertyChanged (cioè alla modifica delle nostre impostazioni) testiamo la connessione (non è obbligatorio ma facciamolo per evitare che l’applicazione vada in crash Tongue out

Private Sub MySettings_PropertyChanged(ByVal sender As Object, ByVal e As
	 	System.ComponentModel.PropertyChangedEventArgs) Handles Me.PropertyChanged
    Dim connection As New SqlClient.SqlConnection
    connection.ConnectionString = My.Settings("MiaConnectionString")
    Try
        connection.Open()
    Catch ex As Exception
        MsgBox("Errore di connessione al Database. Verificare la connessione",
		MsgBoxStyle.Critical, "Connessione")
    Finally
        connection.Close()
    End Try
End Sub

Ok..ci siamo quasi. Ora creiamoci una bella form dove inserire i dati relativi alla nostra connessione al Database. Creiamo qualcosa di simile:

dbsettings

Ora non ci resta che salvare le impostazioni relative alla nostra connessione mediante la chiamata alla nostra Property creata in precedenza in questo modo:

My.Settings.RunTimeConnectionString = "Data Source=" & ServerTxt.Text & ";Initial Catalog=
				" & dbTxt.Text & ";Persist Security Info=True;
				User ID=" & userTxt.Text & "; Password=" & passTxt.Text

Le informazioni relative nostra conenssione sono state aggiornate!!! Open-mouthed