Die Community zu .NET und Classic VB.
Menü

Tipp-Upload: VB.NET 0420: Daten in eine SQLServer Compact DB eintragen

 von 

Hinweis zum Tippvorschlag  

Der Download dieses Vorschlags bedarf einer Freischaltung, welche allerdings noch nicht erfolgte.
Bitte haben Sie ein wenig Geduld, bis die Freigabe erfolgt.

Über den Tipp  

Dieser Tippvorschlag ist noch unbewertet.

Der Vorschlag ist in den folgenden Kategorien zu finden:

  • Datenbanken und XML

Dem Tippvorschlag wurden folgende Schlüsselwörter zugeordnet:
SQL Server Compact, Prepared Statement

Der Vorschlag wurde erstellt am: 19.11.2011 22:02.
Die letzte Aktualisierung erfolgte am 19.11.2011 22:02.

Zurück zur Übersicht

Beschreibung  

Dieses Programmbeispiel liest MP3-Dateien aus einem konfigurierbaren Pfad aus
und trägt Metadaten wie Name, Größe und MD5-Hash in eine eine Datenbank des
Microsoft SQLServers vom Typ Compact ein. Über SQL-Statements kann man z.B. aus
dem Management Studio heraus Dubletten (gleiche Größe, gleicher Hash) finden
Kompiliert wird das Ganze gg. das .NET Framework 4

Schwierigkeitsgrad

Schwierigkeitsgrad 2

Verwendete API-Aufrufe:

Download:

Download nicht freigeschaltet.
' Dieser Source stammt von http://www.activevb.de
' und kann frei verwendet werden. Für eventuelle Schäden
' wird nicht gehaftet.

' Um Fehler oder Fragen zu klären, nutzen Sie bitte unser Forum.
' Ansonsten viel Spaß und Erfolg mit diesem Source!
'
' Beachten Sie, das vom Designer generierter Code hier ausgeblendet wird.
' In den Zip-Dateien ist er jedoch zu finden.

' --------- Anfang Projektdatei SQLCompact001.vbproj ---------
' ------------------ Anfang Datei Form1.vb  ------------------
Imports System.Data.SqlServerCe
Imports System.IO
Imports System.Text
Imports System.Security.Cryptography

' Query um dubletten zu finden:
' select a.anz, a.size, d.pfad, d.name
' from (SELECT   size, md5, count(size) anz
'       FROM    dateien
'       group by    size,md5
'       having  count(size)>1
' ) a
' inner join dateien d
' on     d.size=a.size
' and    d.md5=a.md5
' order by   a.anz desc, a.size desc, d.pfad, d.name;

Public Class Form1

    Private strFilePath As String = "E:\MP3\MP3_Musicload"
    Private strDBPath As String = "d:\Reporting.Database.sdf"
    Private strDBPWD As String = "pwd"

    Private strConn As String = String.Format("Data Source={0};Password=""{1}"";", New _
        String() {strDBPath, strDBPWD})

    Private strConnCreate As String = String.Format("{0}LCID=1031;Encrypt = TRUE;", strConn)
    Private strConnConn As String = String.Format("{0}Persist Security Info=False;", strConn)

    Private Sub Button1_Click(sender As System.Object, e As System.EventArgs) Handles Button1.Click

        Dim bCreateDB As Boolean = False

        Try

            If CheckBox1.Checked Then
                bCreateDB = True
            End If

            If bCreateDB Then

                If My.Computer.FileSystem.FileExists(strDBPath) Then
                    My.Computer.FileSystem.DeleteFile(strDBPath)
                End If

                Dim engine As New SqlCeEngine(strConnCreate)

                engine.CreateDatabase()

            End If

            Using conn As New SqlCeConnection
                conn.ConnectionString = strConnConn
                conn.Open()

                If bCreateDB Then

                    Using cmd As New SqlCeCommand("CREATE TABLE dateien (id int PRIMARY " & _
                        "KEY IDENTITY, pfad nvarchar(255) NOT NULL,  name nvarchar(255) " & _
                        "NOT NULL , size int NOT NULL, md5 nchar(32) default NULL , datum " & _
                        "datetime NOT NULL)", conn)

                        cmd.ExecuteNonQuery()

                    End Using

                    Using cmd As New SqlCeCommand("CREATE index idxsizemd5 on " & _
                        "dateien(size, md5)", conn)

                        cmd.ExecuteNonQuery()
                    End Using

                    Using cmd As New SqlCeCommand("CREATE index idxname on dateien(name)", conn)
                        cmd.ExecuteNonQuery()
                    End Using

                    Using cmd As New SqlCeCommand("CREATE index idxpfad on dateien(pfad)", conn)
                        cmd.ExecuteNonQuery()
                    End Using

                End If

                Using cmd As New SqlCeCommand("insert into dateien (pfad, name, size, " & _
                    "md5, datum) values(@pfad, @name, @size, @md5, @datum)", conn)

                    Dim pfadparam As New SqlCeParameter("@pfad", System.Data.SqlDbType.NVarChar)
                    Dim nameparam As New SqlCeParameter("@name", System.Data.SqlDbType.NVarChar)
                    Dim sizeparam As New SqlCeParameter("@size", System.Data.SqlDbType.Int)
                    Dim md5param As New SqlCeParameter("@md5", System.Data.SqlDbType.NChar)
                    Dim datumparam As New SqlCeParameter("@datum", System.Data.SqlDbType.DateTime)

                    cmd.Parameters.Add(pfadparam)
                    cmd.Parameters.Add(nameparam)
                    cmd.Parameters.Add(sizeparam)
                    cmd.Parameters.Add(md5param)
                    cmd.Parameters.Add(datumparam)

                    Dim Dir As FileInfo() = New DirectoryInfo(strFilePath).GetFiles( _
                        "*.mp3", SearchOption.AllDirectories)

                    Using trans As SqlCeTransaction = conn.BeginTransaction()

                        For Each datei As FileInfo In Dir

                            Try

                                pfadparam.Value = datei.DirectoryName
                                nameparam.Value = datei.Name
                                sizeparam.Value = datei.Length
                                datumparam.Value = datei.LastWriteTime

                                Using fstream As FileStream = New FileStream(datei.FullName, _
                                    FileMode.Open, FileAccess.Read, FileShare.Read)

                                    Dim hash() As Byte = New MD5CryptoServiceProvider( _
                                        ).ComputeHash(fstream)

                                    Dim sb As New StringBuilder(hash.Length * 2)

                                    For Each hex As Byte In hash
                                        sb.Append(hex.ToString("X2"))
                                    Next

                                    md5param.Value = sb.ToString

                                End Using

                                cmd.ExecuteNonQuery()

                            Catch ex As Exception

                                Debug.Print(datei.FullName & " nicht bearbeitet")

                            End Try

                        Next

                        trans.Commit()

                    End Using

                End Using

                conn.Close()
            End Using

        Catch ex As Exception

            MsgBox(ex.Message)

        End Try

    End Sub

End Class

' ------------------- Ende Datei Form1.vb  -------------------
' ---------- Ende Projektdatei SQLCompact001.vbproj ----------

	

Diskussion  

Diese Funktion ermöglicht es, Fragen, die die Veröffentlichung des Tipps betreffen, zu klären, oder Anregungen und Verbesserungsvorschläge einzubringen. Nach der Veröffentlichung des Tipps werden diese Beiträge nicht weiter verlinkt. Allgemeine Fragen zum Inhalt sollten daher hier nicht geklärt werden.
Folgende Diskussionen existieren bereits

Um eine Diskussion eröffnen zu können, müssen sie angemeldet sein.