Light SQL in .NET met anorexia
+
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 -
#1 Database -
#2 Project -
#3 clsNawDB -
#4 modPasswordDB
#5 modDiversen -
#6 modCrypt -
#7 frmDbInit -
#8 frmNAW -
#9 NAW.exe
Inleiding

Zomaar een, in de praktijk onbruikbare, database met SQLite-VB GUI
als voorbeeld.
Bij mijn laatste 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.
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.
INFO: Ik programmeer tegenwoordig bij voorkeur
in VB daar ik de programmeeromgeving nog vriendelijker vind als die
bij C#, alleen voor zaken die sneller moeten, of in VB niet zondermeer
kunnen, schrijf ik een C# DLL.
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:
- Class NawDB
De database-Tabel-NAW procedures en functies.
Acties lokaal op DataSet en met SQL statements direct in DB. - Module PasswordDB
De database-Tabel-Password procedures en functies.
Ook een sub-Class om een BindingSourceEvent 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. - Module Diversen
Wat gemeenschappelijke variabelen, functies en subroutines. - Module Crypt
256 bits Rijndeal Encrypt en Decrypt van data en bestanden
Wachtwoordtest - 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. - 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.
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.
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...
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.
- Map NAW
Snelkoppeling naar Mobile\NAW.EXE (in PDA/Smartphone aanmaken)
Snelkoppeling naar Windows\NAW.EXE (in Windows aanmaken)- Map Database
NAW.s3db (het database-bestand) - Map Mobile
NAW.EXE (GUI aangepast aan PDA/Smartphone en zonder Form frmInitDB)
SQLite.Interop.dll
System.Data.SQLite.dll - 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)
- Map Database
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.
Inleiding -
#1 Database -
#2 Project -
#3 clsNawDB -
#4 modPasswordDB
#5 modDiversen -
#6 modCrypt -
#7 frmDbInit -
#8 frmNAW -
#9 NAW.exe