Ik heb het zo duidelijk als ik kon proberen uit te leggen, zie hieronder!
Op de form load moeten wat dingentjes gebeuren, eigenlijk de hele operatie.
private void Form1_Load(object sender, EventArgs e)
{
We laten een messagebox zien zodat ze gebruiker weet wat te doen.
MessageBox.Show("Selecteer de access database waarin u de gebruikers wilt importeren.",
"Selecteer Database", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
We maken een openfiledialog aan die de gebruiker vraagt om het database bestand.
OpenFileDialog dialog = new OpenFileDialog();
Als de gebruiker op ''OK'' heeft gedrukt,
if (dialog.ShowDialog() == DialogResult.OK)
{
Gaat hij kijken of de bestandsnaam eindigd met de database-extentie van access.
if (!dialog.FileName.EndsWith(".mdb"))
{
Als het niet het geval is laat hij een messagebox zien en sluit hij het programma.
MessageBox.Show("Dit bestand is geen geldig database bestand!");
Application.Exit();
}
Als het bestand wél met .mdb eindigd,
Moet hij de connectie pointen naar de databse, de de connectie openen.
Connection = new OleDbConnection("Provider=Microsoft.JET.OLEDB.4.0;data source=" + dialog.FileName);
Connection.Open();
}
}
Vragen waar de map is waarin de bestanden met personen in staan.
MessageBox.Show("Selecteer de map waaruit u de gebruikers wilt importeren.",
"Selecteer Map", MessageBoxButtons.OK, MessageBoxIcon.Asterisk);
Dat doen we met een folder-browser-dialog, zie hieronder.
FolderBrowserDialog folderbrowser = new FolderBrowserDialog();
Als er op ''OK'' is gedrukt (dat er een bestand is gekozen),
if (folderbrowser.ShowDialog() == DialogResult.OK)
{
Het geselecteerde pad in een string stoppen.
string path = folderbrowser.SelectedPath;
Een array van strings aanmaken waarin elk bestands-pad zit dat eindigt met een ''.txt'' extentie.
string[] paths = Directory.GetFiles(path, "*.txt");
Een for-loop starten, die begint bij 0 en doorgaat tot hij alle bestanden heeft gehad. Hij geeft hier een string mee met het pad van het bestand.
for (int i = 0; i < paths.Length; i++)
{
AddToDataBase(paths);
}
Als hij klaar is met het loopen, de connectie sluiten en weggooien.
Connection.Close();
Connection.Dispose();
Een messagebox laten zien met het resultaat, en de applicatie sluiten.
MessageBox.Show("De operatie is geslaagd, hieronder de resultaten:\r\n\r\n" +
"Geslaagd: " + Convert.ToString(succesvol) + "\r\nGefaald: " + Convert.ToString(gefaald));
Application.Exit();
}
}
De functie om het bestandje naar de database te zetten.
private void AddToDataBase(string path)
{
Een lezer aanmaken die het bestand leest die is meegegeven in de for-loop (zie de form_load)
StreamReader lezer = new StreamReader(path);
Alles dat in het bestandje staat in een string proppen.
string alles = lezer.ReadToEnd();
De naam, adres, postcode en stad-tekst wegwerken uit het bestandje door het te vervangen met niks.
alles = alles.Replace("Naam: ", "");
alles = alles.Replace("Adres: ", "");
alles = alles.Replace("Postcode: ", "");
alles = alles.Replace("Stad: ", "");
De tekst die in 'alles' staat splitten met elke enter, en dan in een array van strings zetten.
Een 'Environment.NewLine' staat gelijk aan de string ''\r\n'', dit betekent hetzelfde.
string[] test = System.Text.RegularExpressions.Regex.Split(alles, Environment.NewLine);
Kijken of het bestandje meer of minder regels bevat dat toegestaan is, zo ja, dan is het een fout bestand.
if (test.Length > 4 || test.Length < 4)
{
Laten zien welk bestand het foute bestand is, zodat dat bestand handmatig door de gebruiker ge-fixed kan worden.
MessageBox.Show("Dit bestand is geweigerd wegens incorrecte gegevens:\r\n" + path);
De integer variabele die bijhoud hoeveel er gefaald hebben ophogen met 1, en uit de functie springen zodat er geen foute data word toegevoegd.
Een nieuw commando aanmaken voor de database, die data invoegt ('Insert') in ('Into') de tabel ('Personen').
De kolom-namen móet je definiëren, anders kan het programma de kolommen niet vinden.
Daarna moeten er parameters aangemaakt worden, die je een 'Value' meegeeft.
Ik begin ze met een apenstaart en daarna een kleine 'c', de kleine 'c' is opzich niet nodig, over de apenstaart weet ik het niet zeker.
Zorg er wel voor dat de values een andere naam hebben dan je kolom-namen, voor de zekerheid.
OleDbCommand Command = new OleDbCommand("INSERT INTO Personen ([Naam], [Adres], "
+ "[Postcode], [Stad]) VALUES (@cNaam, @cAdres, @cPostcode, @cStad)", Connection);
Nu voeg je de data uit de array toe aan de parameters. test[0] is bijvoorbeeld de naam, deze geef je aan de parameter ''@cNaam'', welke een string is (character array).
Command.Parameters.Add("@cNaam", OleDbType.Char).Value = test[0];
Command.Parameters.Add("@cAdres", OleDbType.Char).Value = test[1];
Command.Parameters.Add("@cPostcode", OleDbType.Char).Value = test[2];
Command.Parameters.Add("@cStad", OleDbType.Char).Value = test[3];
Nu probeer je het commando uit te voeren. Gaat er iets mis dan vang je dat bij de ''catch'' op.
try
{
Command.ExecuteNonQuery();
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
Het commando weer weggooien.
Aantal succesvolle items in de database gezet ophogen met 1.