Enable Javascript


Last Arduino/ESP project (click to open)
Ster inactiefSter inactiefSter inactiefSter inactiefSter inactief
 

Artikelindex

Light SQL in .NET met anorexia
Inclusief Data en File Cryptografie met 256 bits Rijndael algoritme

SQLite of "SQL Server CE" zonder (het gehannes met) automatisch gegenereerde Database, Connention, Datasets en Queries. Met voorbeeld in Visual Basic 2008 voor Windows & Mobile, eenvoudig om te zetten in C#. Met het 256 bits Rijndael algoritme EnCrypt/DeCrypt op een data-veld toepassen. Met detectie van x86, x64AMD, x64Intel processor

Inleiding:
Bij mijn vorige project Googelde ik een enkele keer om een System.Data.SQL probleempje op te lossen. Ongelooflijk hoeveel vragen daar over zijn en hoe weinig goede/werkende/werkbare oplossingen er worden aangedragen. Zelf bij antwoorden van Microsoft-medewerkers blijf je vaak in het duister tasten. Uiteindelijk ben ik er met doorzoeken en uitproberen natuurlijk wel uitgekomen. Verder bleek mij dat de hoeveelheid informatie en juistheid er van op Forums voor C++ goed is, voor C# redelijk en voor VB zeer slecht. Een probleem is ook dat er in ADO.Net nogal wat paralleloplossingen zijn, verschillende mogelijkheden met het zelfde resultaat. Dus moet je er voor oppassen dat je niet van twee of meer walletjes tegelijk eet. Eerst begonnen met de halfautomatische VS oplossing, maar dat blijkt achteraf meer op het "met een kanon op een mug schieten". Ik wil mijn SQL database "oplossing" best met anderen delen, vandaar deze, laat ik het maar zo noemen, "Workshop". Daarnaast ook nog wat over het versleutelen van wachtwoord, data-velden en bestanden en een sterkwachtwoordgenerator. Nevenbij ook een oplossing voor de, veel geGoogelde, problemen met TextBox.Passwordchar en ComboBox in een DataGridView. Deze oplossing werkt, zonder aanpassingen, zowel bij Windows XP-SP2 t/m Win7 en Mobile 5 t/m 6.5 (dus niet Phone7). Enige kennis over/van SQL, queries, Database en programmeren in VB/C# is wel noodzakelijk, want dit is geen cursus en het "een en ander" kan vast wel beter.


Zomaar een, in de praktijk onbruikbare, database met SQLite-VB GUI als voorbeeld.

Een light SQL DB in Visual Studio 2005 - 2008 (of 2010 zonder Mobile):
In Visual Studio .NET lijkt het heel eenvoudig en makkelijk om een database te genereren en dan automatisch de Connection, Datasetsets, Adapters, BindingSources en de diverse querys te laten aanmaken door databinding in een Form.vb [Design] venster. En dat is het ook, behalve dan als je achteraf wijzigingen wilt aanbrengen in de tabellen, datatypen en queries want dan ben je "in de aap gelogeerd". Zo ook als je het progje distribueert, dan wijst de Connectionstring naar het oorspronkelijke path van jouw project. In tal van Forums staan oplossingen om dit laatste probleem, op meer of minder intelligente wijze, op te lossen. Maar ook dat blijft een heel gehannes want de oude Connection wordt steeds teruggezet of "Server Explorer" en MyDataSet.vb/xsd geven een error. Er is ook een andere, veel directere, oplossing met een heel flexibel resultaat en ook nog eens een veel kleinere EXE (bij mijn SaveMe!! 55%). Als je dan ook SQL Server CE inruilt voor SQLite (public domain) dan heb je ook nog eens minder DLLs en kan je progje ook zonder installatie overal draaien; Windows XP-SP2 t/m Win7, x86, x64AMD, x64Intel en Mobile 5-6.5 PRO.


Dit alles hebben we helemaal niet nodig en gaan we dan ook niet gebruiken

In plaats van het automatisch genereren van diverse bestanden met heel veel programmaregels kun je ook zelf een Class en/of Module schrijven. Dat vergt relatief weinig code, is zeer flexibel en onderhoudsvriendelijk en doet verder precies het zelfde. Een groot voordeel van zelf schrijven is ook dat je ook beter gaat begrijpen hoe het werkt. Op zich vind je dit ook gewoon in VS-HELP terug, daar staan namelijk diverse oplossingen voor het zelfde probleem beschreven. Het vervelende is echter dat dit nogal verspreid staat opgeslagen zodat je blijft bladeren en lezen in plaats van het programmeren.

Wat dit niet is en wat je reeds moet weten:
Dit is geen cursus programmeren, database en SQL statements ontwikkelen. Ik ga er vanuit dat de basiskennis aanwezig is. Zo nodig kun je met Googelen diverse gratis online cursussen vinden. Behoorlijk gedateerd maar heel duidelijk en nog steeds goed bruikbaar, ADO.NET: Developing Database Applications. Informatie over de opbouw van SQL-opdrachten kun je ook overal vinden, maar mijn voorkeur gaat uit naar: Uitgebreid (EN): SQL From Wikipedia, the free encyclopediaL  Beperkt (NL): SQL (Structured Query Language)

SQL Server CE (gebruik ik niet meer):
Dat is bij Visual Studio .NET inbegrepen maar heeft als nadeel dat het uit vele DLLs bestaat, nogal veel bytes nodig heeft en dat je progje zonder installatie niet zal werken. SQL Sever CE, de laatste 2 tekens zeggen het al, is oorspronkelijk bedoeld voor Windows Smart Device, maar is ook bruikbaar voor Windows XP-SP2 t/m Win7 toepassingen. De informatie in Help-MSDN (t/m 2008) is verre van compleet maar bij microsoft.com kun je wel alles vinden: SQL Server Compact 3.5 Books Online en hier ADO.NET

SQLite & SQLite.NET (mijn voorkeur, open source):
SQLite en SQLite.NET code is practisch gelijk aan SQL Server CE en ADO.NET. SQLite kun je zo op het WWW vinden en is universeel inzetbaar. Het is echter niet zomaar even in VB/C#.NET te gebruiken, er is een zogenaamde "wrapper" nodig om er confortabel mee te kunnen werken. Bij http://sqlite.phxsoftware.com/ vindt je een perfecte wrapper (System.Data.SQLite) met er bij laatste SQLite versie:

System.Data.SQLite
An open source ADO.NET provider for the SQLite database engine
There are zero licensing restrictions for private or commercial use

Na installatie van deze wrapper werkt het in Visual Studio net zo als SQL Server CE alleen moet je op een enkele plaats de namespace SqlServerCe.<nnn> vervangen door SQLite.<nnn>. Met "alles" bedoel ik ook alles, dus ook het automatisch aanmaken en het "gehannes" van een database, Connection en Datasets (dat doen we hier dus niet). Het grote voordeel van SQLite is dat je progje slechts één SQL-DLL nodig heeft en je het zonder installatie kunt gebruiken. Bij Windows Mobile sluit je 2 DLLs bij. Helaas heeft men aparte DLLs voor 32 en 64 bits systemen gecompileerd, x86, x64AMD en x64Intel. Daardoor moet je bij distributie van je progje altijd 3 DLLs bijsluiten en er voor zorgen dat de juiste wordt gebruikt. Ook daar vindt je hier een programmatische oplossing voor zodat gebruikers hier geen hinder van ondervinden.

SQLite Administrator (database opzetten, freeware):
Dit is een zeer eenvoudig te gebruiken en redelijk goed hulpje om je tabellen te ontwerpen en te wijzigen. Je vindt het hier http://sqliteadmin.orbmu2k.de/ Hierin maak je je database met tabel(len) welke je dan in je toepassing gaat gebruiken. Achteraf aanpassen is simpel en je kunt eventueel ook data invoeren en bewerken. Het is nog Beta, maar ik kwam alleen maar een paar schoonheidfoutjes tegen.

Van VB naar C#:
Hier http://www.developerfusion.com/tools/convert/vb-to-csharp/ gaat dat perfect. Klik wel 2 x op copy to clipboard want soms.... Waarom in VB? Het WWW staat vol met C++ en C# oplossingen, voor VB is dat nogal beperkt. Conversie van VB naar C# gaat probleemloos en moet voor een beetje C Sharper een zachtgekookt eitje zijn.

Welke zaken zijn nodig om met je database te kunnen werken:
Eigenlijk net als bij het automatisch genereren: Connection, DataSet, Adapter, DataTable en als je Controls aan data wilt binden ook nog een BindingSource met Event. Een DataRow per tabel is extra, meer daarover volgt later. Het verschil is alleen dat je ze zelf declareert en ook zelf bepaald wat je ermee gaat doen. Dat bespaart je een enorme hoeveelheid, automatisch gegenereerde, onoverzichtelijke code.


Voorbeeld uit mijn SaveMe!! project
Merk op dat hier een Module is gebruikt, Module of Class, dat is afhankelijk van je toepassing

Deze attributen kun je zeer flexibel inzetten en gebruiken. DataBinding aan de diverse Form-controls kun je in het Form_Load-Event programmeren. Ook DataGridView-DataSource (en aanverwante eigenschappen) kun je gewoon in je code toepassen. In plaats van DataBinding kun je ook de BindingSource-Evens benutten om Controls, al dan niet aangepast, met DB-data te vullen. Beide methoden komen in een Form aan bod.

Dezelfde module voor Windows XP-Win7 en Mobile:
Mobile gebruikt een sterk beperkte commandoset en heeft soms een wat andere notatie en parameters nodig dan je normaal voor Windows zou coderen. Door hier rekening mee te houden kun je met één module voor beide toepassingen volstaan. Wel moet Mobile een eigen exemplaar hebben daar het anders een foutmelding geeft over de versie van System.Data in Compact Framework.

Wat gaan we maken:
Een heel eenvoudige, nogal rommelige, NAW database toepassing. Dat rommelige komt omdat het gebruik van de DB module voorop staat en de NAW-toepassing helemaal niets voorstelt cq op de voorbeeldfunctie na totaal nutteloos is. Ook geen tabelverknopingen/koppelingen/....., zoals voor een relationele -database, die kun je later zelf aanbrengen door het toevoegen van de daarvoor benodigde queries (gebruik de queries in de module als voorbeeld).De volgende Classes en Modules komen aan bod:

  1. Class NawDB
    De database-Tabel-NAW procedures  en functies.
    Acties lokaal op DataSet en met SQL statements direct in DB.
  2. Module PasswordDB
    De database-Tabel-Password procedures  en functies.
    Ook een sub-Class om een BindingSource Event in een Class/Forms beschikbaar te maken.
    Daar Password uit slechts één record bestaat welke en overal gelijk moet zijn kan dit in een module worden gestopt.
  3. Module Diversen
    Wat gemeenschappelijke variabelen, functies en subroutines.
  4. Module Crypt
    256 bits Rijndeal Encrypt en Decrypt van data en bestanden
    Wachtwoordtest
  5. Form frmInitDB
    Test op 32/64bits Intel- of AMD-processor en klaarzetten van de juiste System.DataSQLite.DLL (1 uit 3 DLLs)
    Test op database aanwezig.
    Zet applicatie-Path, DB-filenaam en ConnectionString.
  6. Form frmNAW
    Demonstreren de werking van DB Module en Class.
    Beveiligde wachtwoordbeveiliging vanuit database.
    Listbox voor het snel voorzetten van een item in de TextBoxes en het DataGridView.
    DataGridView met DataGridViewTextBoxColumn.PasswordChar (*) en DataGridViewComboBoxColumn.
    Versleutelde (Encrypt)  datavelden, via het wachtwoord, SubKey en Key.

Om het eenvoudig te houden wordt er "recht toe, recht aan", met duidelijke benamingen, gecodeerd. Aan het eindeloos voorzien van Remarks heb ik een hekel, ik vind dan de code onnodig uitgerekt waardoor het onoverzichtelijk wordt. Dus probeer ik de code "voor zichzelf" te laten spreken. Ik gebruik modules om variabelen en datavelden, in meerdere Forms/Classes/Modules tegelijk, met dezelfde waarden beschikbaar te hebben. In dit geval ook voor de Password-tabel.

De programmacode:
OOPs, ik ben ik niet eigenwijs, maar doe het wel op mijn eigen wijze! De Experts zullen wel de nodige bedenkingen hebben daar dit allemaal nu niet bepaald een OOP codering is. Ook zijn er Functions en Subs welke algemener bruikbaar zouden kunnen zijn. En daar hebben ze dan ook volkomen gelijk in. Maar dat OOP een must is, dat tijdperk, daar ben ik allang overheen. Soms is lekker ouderwets "recht toe, recht aan" programmeren ook een goede oplossing. Natuurlijk moet je de vroegere assembler en MS-Basic spaghetti's vergeten, maar zo kan het ook goed en onderhoudsvriendelijk zijn.
Maar... zo, op mijn eigen wijze dus, is het wat sneller, kleiner en toch overzichtelijk. Dus ook makkelijk aan te passen en vooral dat laatste, dat is hier belangrijk. En als Expert kun je er alsnog echte OOP van maken; toch...
Info: Over spaghetti gesproken, ik ben in 1976 met Motorola 6800 machinetaal begonnen, daarna de "hogere talen" 68nn en 6502 assembler. Hoe men (we) toentertijd de code "verbeterde" en uitbreide, dat was op de duur totaal onleesbaar door het achteraf tussengevoegd heen en weer springen.

Het al dan niet delen van één database met Windows XP-Win7 en Mobile:
Het delen gaat eenvoudig zo: Al de volgende mappen en bestanden op één geheugenkaartje of USB-stick en het is universeel te gebruiken.

  1. Map NAW
    Snelkoppeling naar Mobile\NAW.EXE (in PDA/Smartphone aanmaken)
    Snelkoppeling naar Windows\NAW.EXE (in Windows aanmaken)
    1. Map Database
      NAW.s3db (het database-bestand)
    2. Map Mobile
      NAW.EXE (GUI aangepast aan PDA/Smartphone en zonder Form frmInitDB)
      SQLite.Interop.dll
      System.Data.SQLite.dll
    3. Map Windows
      NAW.EXE
      System.Data.SQLite.AMD64.dll
      System.Data.SQLite.IA64.dll
      System.Data.SQLite.x86.dll
      (Form InitDB kiest de juiste DLL en kopieert deze dan als System.Data.SQLite.dll)

Zonder Mobile sla je punt 2 over, zonder Windows sla je punt 3 over. In die gevallen zou je ook de database  in de map bij de EXE kunnen plaatsen, dan moet je bij Form InitDB een aanpassing in de code maken bv DbPath = AppPath.
Als je het in een Windows-system-folder zet dan moet je voor de map Database en het bestand NAW.s3db de rechten voor schrijven aanpassen (of NAW.s3db in een documentenmap plaatsen en in het programma het path aanpassen).
LET OP de namen van de SQLite-DLLs!
SQLite.NET komt met diverse processor-Folders met daarin steeds een voor die processor specifieke System.Data.SQLite.dll.
Deze moet je zelf van de juiste namen voorzien (zie bij Map Windows hierboven).
Voor mobiele moet je SQLite.Interop.nnn.dll (nnn staat voor een getal bv. 066) wijzigen in SQLite.Interop.dll.
SQLite-foutmeldingen tijdens het opstarten zijn meestal aan een verkeerde DLL te wijten.


Na installatie van SQLite.NET vindt je hier de diverse DLLs.

Geen Demo-Download:
Gewoon "op je eigen wijze"gebruik maken van het voorbeeld en eventueel wat code kopiëren en plakken. dan weet je waar je mee bezig bent.