Schlagwort-Archive: C#

SQLite 3 mit Visual Studio und Entity Framework

Einleitung

SQLite ist eine eingebettete Einzeldateidatenbank. SQLite eignet sich ideal für Desktopanwendungen
und Projekte. Die zum Beispiel einzige Client- bzw. Benutzer-seitige-Datenbank benötigen,
um Anwendungsdaten zu speichern.

Das Entity Framework 6 vereinfacht die Arbeit mit Datenbanken erheblich und konvertiert das Datenbankschema in Klassen, die Tabellen repräsentieren.

Es ist jedoch ein etwas kniffeliger Weg, um SQLite mit dem Entity Framework 6 (EF6)
zum laufe zu bekommen.

Grundlegendes – Installation der Vorraussetzungen

Als Grundlage für diesen Artikel arbeite ich mit einer SQLite3 Datenbank, welche ich zuvor mit
SQLite Studio v3.2.1 erstellt habe. Welches man sich hier kostenlos herunterladen kann:

https://sqlitestudio.pl/index.rvt?act=download

Für diesen Beitrag nutze ich Visual Studio 2017 Community Edition.

Nachdem wir eine Datenbank haben, brauchen wir noch eine entsprechende Runtime: System.Data.SQLite
Diese können wir hier herunterladen: https://system.data.sqlite.org/index.html/doc/trunk/www/downloads.wiki

Hier gibt es einige Versionen zu finden, unabhängig, ob ihr eine x86 oder x64
DotNet installiert habt, brauchen wir die x86 Version eurer installierten .NET Version.
In meinem Fall war es die sqlite-netFx46-setup-bundle-x86-2015-1.0.110.0 Datei, welche bei mir gut funktioniert.
( https://system.data.sqlite.org/downloads/1.0.110.0/sqlite-netFx46-setup-bundle-x86-2015-1.0.110.0.exe )

Bevor ihr die Installation startet müsst ihr Visual Studio einmal schließen.
Startet die Installation mit folgenden Installationsparametern:

SQLIte Installation
Installation

SQL Server Compact Toolbox installieren

Nun benötigen wir noch eine Visual Studio Erweiterung SQLite/SQL Server Compact Toolbox
Diese können wir hier heruntergeladen und anschließend mit einem Doppelklick installieren:
https://marketplace.visualstudio.com/items?itemName=ErikEJ.SQLServerCompactSQLiteToolbox

SQLite Server Compact Toolbox
SQLite Server Compact Toolbox
Visual Studio Erweiterung Installation

Ist auch die Erweiterung erfolgreich installiert, haben wir alle Voraussetzungen erfüllt,
sodass wir mit Visual Studio und dem Entity Framework 6 arbeiten können.

Entity Model erstellen

Nachdem wir nun soweit alles haben, können wir Visual Studio wieder starten und ein neues Projekt erstellen oder bestehendes verwenden. Ich habe hierzu ein neues Konsolenprojekt erstellt.
Damit wir mit dem Entity Framework arbeiten können,
müssen wir unserem Projekt ein Nuget-Package hinzufügen.

Installiert euch das Nuget-Package:
System-Data.SQLite
(ich habe die last-stable: 1.0.110 verwendet)

SQLite Nuget Package
SQLite Nuget Package

Weitere Informationen zu dem Nuget-Package kann man hier finden:
https://system.data.sqlite.org/index.html/doc/trunk/www/index.wiki

In meinem Projektmappenexplorer erstelle ich ein neues Verzeichnis “Database”
und füge ein neues Element hinzu, wähle hierbei ein Element vom Typ ADO.NET Entity Data Model.
Einen Schritt weiter wählen wir EF Designer aus Datenbank, aus.

Wir wählen EF Designer aus Datenbank aus.


Mit dem Klick auf “Neue Verbindung” solltet ihr nun einen neuen Eintrag zur Auswahl haben:

SQLite EF Provider
SQLite Provider

Hier wählen wir SQLiteProvider aus. Im folgendem Dialog können wir nun unsere Datenbank auswählen. Hier tragen wir einfach den kompletten Pfad der Datei ein.

Unter Data Source geben wir den Pfad der Datenbank an
Unter Data Source geben wir den Pfad der Datenbank an

Wir können hier noch mit einem Klick auf “Verbindung Testen”. Ihr solltet hier,
solange ihr alles richtig gemacht habt eine positive Nachricht bekommen.

Im nächsten Schritt, könnt ihr dann die Tabellen auswählen, von denen das Schema übernommen werden soll.
(In meinem Fall übernehme ich alle)
Ist dies abgeschlossen, wird eine edmx Datei generiert, dass kann je nach Umfang der Datenbank ein bisschen dauern.

SQLite edmx Mpdell

Optionaler Workaround

Falls ihr nun im Code eine LINQ Abfrage und eine Exception wie hier erhaltet:

Exception bei einer Linq Abfrage mit SQLite


System.InvalidOperationException: “Für den ADO.NET-Anbieter mit dem invarianten Namen ‘System.Data.SQLLite’ wurde kein Entity Framework-Anbieter gefunden. Stellen Sie sicher, dass der Anbieter im Abschnitt ‘entityFramework’ der Anwendungskonfigurationsdatei registriert ist. Weitere Informationen finden Sie unter ‘http://go.microsoft.com/fwlink/?LinkId=260882’.

Gibt es einen kleinen Workaround. Dazu öffnen, wir die App.config.
Welche sich im Projektverzeichnis befindet und fügen zwischen Zeile 18 und 19 eine weitere
hinzu:

So das unser Providerselement so aussieht:

    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6"/>
    </providers>
SQLite3 Provider hinzufügen.
SQLite3 Provider hinzufügen.

Wir speichern das ganze nun ab und starten unsere Konsolenanwendung neu.

Beispiel wie wir Daten ausleesn könnten.
Beispiel wie wir Daten ausleesn könnten.

Wenn ich ein Breakpoint in die linq query setze, läuft die Anwendung so durch und
ich kann Daten auslesen, ohne eine Fehlermeldung.

Fazit

Mit SQLite kann ich modern und mit dem Entity Framework bequem
Daten auslesen, schreiben und bearbeiten.
Ist man eine Entwicklungsumgebung mit MSSQL und dem EF6 gewohnt,
ist erfreulich mit einem kostenlosen RDBMS zu arbeiten.
Halten sich die Datenmengen in einem übersichtlichen Rahmen,
dürfte das DB-System eine gute Wahl sein. Auch wenn der Start mit der Einrichtung
etwas tricky und fummelig ist.

Weiterführende Informationen

Möchten ihr in diesem Bereich euch noch tiefergehend informieren kann ich euch eine Lektüre empfehlen, welche mir schon in vielen Bereichen zu dem Thema geholfen hatm dass Buch Sqlite 3 – Einstieg in die Datenbankwelt , beinhaltet viele nützliche Informationen, die uns auch in der ganzen SQL Welt weiterhelfen, zu einem günstigen Preis

C# Get Classes by an assembly

Hello  buddies,

today i want to show you a code snippet where you can get all class names of an internal or external library or an assembly. You have to add the library as an Reference.

I am developing in the company a framework, where i need the names of classes of an external library which i added as reference.

We need a using, called System.Reflection.Assembly.

The code to get classes of an assembly:

static void Main(string[] args)
{
ListOfClasses("Company.LibraryNameOrAssemblyName"); //call the method with a library. which you add as reference.
Console.Read();
}
public static string[] ListOfClasses(string name)
{
 
Assembly assembly = Assembly.ReflectionOnlyLoad(name); //create an new object of Assembly type.
string[] classes = new string[assembly.GetTypes().Length]; //get count of types 
 
int counter = 0; //counter for array index, loop through available types
foreach (var classtype in assembly.GetTypes())
{
classes[counter] = classtype.FullName; //add Name of class to array.
counter++; //increase index counter
}
return classes; // return result as array
 
}

If you execute the code you will get back an array filled with classnames from the library.

c# assembly classes

C# get classes of assembly

 

Hope, someone will find it helpfull.

C# Get directory size using LINQ, c# GetDirectorySize

C# Get directory size using LINQ, DirectorySize

Sometimes you need or must know the folder DirectorySize or frin more directories in C#.
In this case you can use this method, which get the folder size in c#, the output size is in bytes.

public static long DirectorySize(string parentDirectory)
{
return new DirectoryInfo(parentDirectory).GetFiles(searchPattern: "*", searchOption: SearchOption.AllDirectories).Sum(file =&gt; file.Length);
}

In this linq method you can also set an search pattern and choose if only TopDirectories or AllDirectories will be run through.

C# Serialize object to XML

Gerne werden XML Dokumente verwendet, um Einstellungen oder ähnliches abzuspeichern.
Das Thema  möchte ich euch im folgendem Post näher bringen.

Ziel: Ziel dieses Tutorials ist es in C# eine Serialisierung von XML-Dokumetnen vorzunehmen.

In der objekorientierten Welt erstellen wir uns erstmal ein beliebig epublic Klasse: Person.cs
In diesem Beispiel, erstelle ich Eigenschaften einer Person. Eine Person besitzt gewöhnlich einen Vor- und Nachnamen, Alter, Wohnort, Straße, Postleitzahl usw. Meine Klasse Person hat somit folgend Properties (Consolen Applikation!):

using System;using System.Linq;
namespace XMLSerialization{public class Person{string firstname;string lastname;string city;int postalcode;byte age;string street;string housenumber;int phonenumber;int mobilenumber;string Email;

 

////// Gets or sets the p email.///
////// The p email.///public string PEmail{get{return this.Email;}set{this.Email = value;}}
////// Gets or sets the street.///
////// The street.///public string Street{get{return this.street;}set{this.street = value;}}
////// Gets or sets the firstname.///
////// The firstname.///public string Firstname{get{return this.firstname;}set{this.firstname = value;}}
////// Gets or sets the lastname.///
////// The lastname.///public string Lastname{get{return this.lastname;}set{this.lastname = value;}}
////// Gets or sets the city.///
////// The city.///public string City{get{return this.city;}set{this.city = value;}}
////// Gets or sets the postalcode.///
////// The postalcode.///public int Postalcode{get{return this.postalcode;}set{this.postalcode = value;}}
////// Gets or sets the age.///
////// The age.///public byte Age{get{return this.age;}set{this.age = value;}}
///////// Gets or sets the housenumber.///
////// The housenumber.///public string Housenumber{get{return this.housenumber;}set{this.housenumber = value;}}
////// Gets or sets the phonenumber.///
////// The phonenumber.///public int Phonenumber{get{return this.phonenumber;}set{this.phonenumber = value;}}
////// Gets or sets the mobilenumber.///
////// The mobilenumber.///public int Mobilenumber{get{return this.mobilenumber;}set{this.mobilenumber = value;}}
}}

Ende des Codes der public Klasse Person.cs

Nun müssen wir eine Neue Person (Name Jack) erstellen und der Person Eigenschaften zuweisen, dies wird in unserem Main Aufruf gemacht:

using System;using System.IO;using System.Linq;using System.Xml.Serialization;
namespace XMLSerialization{class Program{static string file;
////// Defines the entry point of the application.///
///The arguments. static void Main(string[] args){///Console.WriteLine(“Filename:”);file = AppDomain.CurrentDomain.BaseDirectory + Console.ReadLine();//Create a new objeft of type PersonPerson personJack = new Person();Console.WriteLine(“Age:”);personJack.Age = Convert.ToByte(Console.ReadLine());Console.WriteLine(“Street:”);personJack.Street = Console.ReadLine();Console.WriteLine(“City:”);personJack.City = Console.ReadLine();Console.WriteLine(“Firstname:”);personJack.Firstname = Console.ReadLine();Console.WriteLine(“Lastname:”);personJack.Lastname = Console.ReadLine();Console.WriteLine(“Housenumber:”);personJack.Housenumber = Console.ReadLine();Console.WriteLine(“Mobile:”);personJack.Mobilenumber = Convert.ToInt32(Console.ReadLine());Console.WriteLine(“Phone:”);personJack.Phonenumber = Convert.ToInt32(Console.ReadLine());Console.WriteLine(“Mail:”);personJack.PEmail = Console.ReadLine();Console.WriteLine(“Postalcode:”);personJack.Postalcode = Convert.ToInt32(Console.ReadLine());
Console.WriteLine(“Press enter to serialize…”);
Console.Read();///Call Serialize method and serialize objedct to xml file.Serialize(personJack);}
////// Serializes the specified person jack.///
///The person jack. static void Serialize(Person personJack){XmlSerializer xmlSer = new XmlSerializer(typeof(Person));using (TextWriter txtwriter = new StreamWriter(file)){xmlSer.Serialize(txtwriter, personJack);}}}}}}

Nun haben wir ein Objekt des Typs Person in  eine XML Datei serialisiert,compilieren wir die Anwendung, müssen wir erst den Dateinnamen angeben z.b.: Jack.xml und anschließend die Eigenschaften schreiben und mit Enter bestätigen.
Eingaben könnten wie folgt aussehen:

Input XML Serialization
Input XML Serialization

Als Ergebnis werden meine Objekte in eine XML-Datei serialisiert, Öffnet man die XML Datei mit einem Browser sehen wir folgendes Ergebnis:

 

XML Result
XML Result

Die Solution könnt ihr um, den Blogeintrag besser nachzuvollziehen hier herunterladen.
Mit dieser Solution könnt ihr das ganze auch wieder deserialisieren. Klick hier.