-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathQa.vb
More file actions
2002 lines (1722 loc) · 98.7 KB
/
Qa.vb
File metadata and controls
2002 lines (1722 loc) · 98.7 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
461
462
463
464
465
466
467
468
469
470
471
472
473
474
475
476
477
478
479
480
481
482
483
484
485
486
487
488
489
490
491
492
493
494
495
496
497
498
499
500
501
502
503
504
505
506
507
508
509
510
511
512
513
514
515
516
517
518
519
520
521
522
523
524
525
526
527
528
529
530
531
532
533
534
535
536
537
538
539
540
541
542
543
544
545
546
547
548
549
550
551
552
553
554
555
556
557
558
559
560
561
562
563
564
565
566
567
568
569
570
571
572
573
574
575
576
577
578
579
580
581
582
583
584
585
586
587
588
589
590
591
592
593
594
595
596
597
598
599
600
601
602
603
604
605
606
607
608
609
610
611
612
613
614
615
616
617
618
619
620
621
622
623
624
625
626
627
628
629
630
631
632
633
634
635
636
637
638
639
640
641
642
643
644
645
646
647
648
649
650
651
652
653
654
655
656
657
658
659
660
661
662
663
664
665
666
667
668
669
670
671
672
673
674
675
676
677
678
679
680
681
682
683
684
685
686
687
688
689
690
691
692
693
694
695
696
697
698
699
700
701
702
703
704
705
706
707
708
709
710
711
712
713
714
715
716
717
718
719
720
721
722
723
724
725
726
727
728
729
730
731
732
733
734
735
736
737
738
739
740
741
742
743
744
745
746
747
748
749
750
751
752
753
754
755
756
757
758
759
760
761
762
763
764
765
766
767
768
769
770
771
772
773
774
775
776
777
778
779
780
781
782
783
784
785
786
787
788
789
790
791
792
793
794
795
796
797
798
799
800
801
802
803
804
805
806
807
808
809
810
811
812
813
814
815
816
817
818
819
820
821
822
823
824
825
826
827
828
829
830
831
832
833
834
835
836
837
838
839
840
841
842
843
844
845
846
847
848
849
850
851
852
853
854
855
856
857
858
859
860
861
862
863
864
865
866
867
868
869
870
871
872
873
874
875
876
877
878
879
880
881
882
883
884
885
886
887
888
889
890
891
892
893
894
895
896
897
898
899
900
901
902
903
904
905
906
907
908
909
910
911
912
913
914
915
916
917
918
919
920
921
922
923
924
925
926
927
928
929
930
931
932
933
934
935
936
937
938
939
940
941
942
943
944
945
946
947
948
949
950
951
952
953
954
955
956
957
958
959
960
961
962
963
964
965
966
967
968
969
970
971
972
973
974
975
976
977
978
979
980
981
982
983
984
985
986
987
988
989
990
991
992
993
994
995
996
997
998
999
1000
'De instellingen en geimporteerde namespaces van deze module.
Option Compare Binary
Option Explicit On
Option Infer Off
Option Strict On
Imports ADODB
Imports Microsoft.Office.Interop
Imports System
Imports System.Collections.Generic
Imports System.Convert
Imports System.Diagnostics
Imports System.Environment
Imports System.IO
Imports System.Linq
Imports System.Text
Imports System.Windows.Forms
'Deze module bevat de kern procedures van dit programma.
Public Module QaModule
'Bevat een opsomming van de parameter definitie elementen.
Private Enum ParameterDefinitieOpsomming As Integer
NaamElement 'Naamelement.
MaskerElement 'Maskerelement.
StandaardWaardeElement 'Standaardwaardeelement.
CommentaarElement 'Commentaarelement.
End Enum
'Bevat de definities voor de instellingen van dit programma.
Public Structure InstellingenDefinitie
Public BatchBereik As String 'Definieert de volgnummers van de eerste en de laatste query in een uit te voeren batch.
Public BatchInteractief As Boolean 'Definieert of de gebruiker eerst parameters moet invoeren voordat een batch uitgevoerd kan worden.
Public BatchQueryPad As String 'Definieert het pad en/of de bestandsnaam zonder volgnummers van de query's in een uit te voeren batch.
Public Bestand As String 'Definieert het pad en/of de bestandsnaam van het programmainstellingenbestand.
Public EMailTekst As StringBuilder 'Definieert de tekst van de e-mail met de geëxporteerde resultaten.
Public ExportAfzender As String 'Definieert de naam van de afzender van de e-mail met de geëxporteerde resultaten.
Public ExportAutoOpenen As Boolean 'Definieert of een export automatisch na het exporteren geopend wordt.
Public ExportAutoOverschrijven As Boolean 'Definieert of een bestand automatisch overschreven wordt bij het exporteren van de queryresultaataten.
Public ExportAutoVerzenden As Boolean 'Definieert of de e-mail met de geëxporteerde resultaten automatisch verzonden wordt.
Public ExportCCOntvanger As String 'Definieert het e-mail adres van de ontvanger van het kopie van de e-mail met de geëxporteerde resultaten.
Public ExportKolomAanvullen As Boolean 'Definieert of de data in een kolom moet worden aangevuld met spaties.
Public ExportOnderwerp As String 'Definieert het onderwerp van de e-mail met de geëxporteerde resultaten.
Public ExportOntvanger As String 'Definieert het e-mail adres van de ontvanger van de e-mail met de geëxporteerde resultaten.
Public ExportStandaardPad As String 'Definieert het standaardpad voor het exporteren van queryresultaataten.
Public QueryAutoSluiten As Boolean 'Definieert of dit programma na het uitvoeren van een query en een eventuele export automatisch afgesloten wordt.
Public QueryAutoUitvoeren As Boolean 'Definieert of een query automatisch uitgevoerd wordt na het laden.
Public QueryRecordSets As Boolean 'Definieert of er meer dan een recordset kan worden teruggestuurd door de database als het resultaat van een query.
Public QueryTimeout As Integer 'Definieert het aantal seconden dat het programma wacht op het queryresultaat nadat opdracht is gegeven de query uit te voeren.
Public VoorbeeldKolomBreedte As Integer 'Definieert de maximale kolombreedte die gebruikt wordt om het queryresultaat te tonen in het voorbeeldvenster.
Public VoorbeeldRegels As Integer 'Definieert het maximum aantal regels dat van het queryresultaat wordt getoond in het voorbeeldvenster.
Public VerbindingsInformatie As StringBuilder 'Definieert de voor de verbinding met een database noodzakelijke gegevens.
End Structure
'Bevat de definities voor de opdrachtregelparameters die eventueel zijn opgegeven bij het starten van dit programma.
Public Structure OpdrachtRegelParametersDefinitie
Public InstellingenPad As String 'Definieert het opgegeven instellingenpad.
Public QueryPad As String 'Definieert het opgegeven querypad.
Public SessiesPad As String 'Definieert het opgegeven sessielijstpad.
Public Verwerkt As Boolean 'Definieert of de opdrachtregelparameters zonder fouten zijn verwerkt.
End Structure
'Bevat de definities voor een query.
Public Structure QueryDefinitie
Public Code As String 'Definieert de code van een query.
Public Pad As String 'Definieert het pad van een querybestand.
Public Geopend As Boolean 'Definieert of het querybestand kon worden geopend.
End Structure
'Bevat de definities voor de parameter gegevens van de geselecteerde query.
Public Structure QueryParameterDefinitie
Public Commentaar As String 'Definieert het commentaar bij de parameter.
Public Invoer As String 'Definieert de invoer van de gebruiker.
Public Lengte As Integer 'Definieert de lengte van de parameterdefinitie.
Public LengteIsVariabel As Boolean 'Definieert of de lengte van de invoer variabel is.
Public Masker As String 'Definieert het invoer masker van de parameter.
Public ParameterNaam As String 'Definieert de naam van de parameter.
Public Positie As Integer 'Definieert de positie relatief ten op zichte van de vorige definitie.
Public StandaardWaarde As String 'Definieert de standaardwaarde van de parameter.
Public VeldIsZichtbaar As Boolean 'Definieert of het invoerveld zichtbaar is.
End Structure
'Bevat de definities voor het resultaat van een query.
Public Structure QueryResultaatDefinitie
Public KolomBreedte As List(Of Integer) 'Definieert per kolom de maximale breedte in bytes van de gegevens.
Public RechtsUitlijnen As List(Of Boolean) 'Definieert per kolom of de gegevens rechtsuitgelijnd worden bij weergave.
Public Tabel(,) As String 'Definieert de door een query opgevraagde gegevens uit een database.
End Structure
Public Const GEBRUIKER_VARIABEL As String = "$$GEBRUIKER$$" 'Indien aanwezig in de verbindingsinformatie geeft deze variabel de positie van de gebruikersnaam aan.
Public Const WACHTWOORD_VARIABEL As String = "$$WACHTWOORD$$" 'Indien aanwezig in de verbindingsinformatie geeft deze variabel de positie van het wachtwoord aan.
Private Const ALLE_REGELS As Integer = -1 'Staat voor "alle voorbeeld regels".
Private Const ASCII_A As Integer = 65 'De ASCII-waarde voor het teken "A".
Private Const ASCII_Z As Integer = 90 'De ASCII-waarde voor het teken "Z".
Private Const COMMENTAAR_TEKEN As Char = "#"c 'Geeft aan dat een regel in een instellingenbestand commentaar is.
Private Const CSV_SCHEIDINGSTEKEN As Char = ";"c 'Scheidt kolommen in CSV bestanden.
Private Const DEFINITIE_TEKENS As String = "$$" 'Geeft het begin en het einde van een parameterdefinitie binnen een query aan.
Private Const ELEMENT_TEKEN As Char = ":"c 'Scheidt de parameterdefinitie elementen van elkaar.
Private Const EXCEL_MAXIMUM_AANTAL_KOLOMMEN As Integer = 255 'Het maximale aantal door Microsoft Excel ondersteunde kolommen.
Private Const GEEN_LETTER As Integer = 64 'Staat voor "geen letter". (De ASCII waarde die voor het "A" teken komt.)
Private Const GEEN_MAXIMALE_BREEDTE As Integer = -1 'Staat voor "geen maximale kolom breedte".
Private Const MAXIMUM_AANTAL_ELMENTEN As Integer = 4 'Staat voor het maximaal toegestane aantal elementen in een parameterdefinitie.
Private Const MASKER_CIJFER As Char = "#"c 'Geeft in een masker aan dat er een cijfer als invoer wordt verwacht.
Private Const MASKER_HOOFDLETTER As Char = "_"c 'Geeft in een masker aan dat er een hoofdletter als invoer wordt verwacht.
Private Const PARAMETER_TEKEN As Char = "?"c 'Scheidt de opdrachtregelparameters van elkaar.
Private Const SECTIE_NAAM_BEGIN As String = "["c 'Geeft het begin van een sectie naam in een instellingenbestand aan.
Private Const SECTIE_NAAM_EINDE As String = "]"c 'Geeft het einde van een sectie naam in een instellingenbestand aan.
Private Const SQL_COMMENTAAR_BLOK_BEGIN As String = "/*" 'Staat voor het begin van een SQL-commentaarblok.
Private Const SQL_COMMENTAAR_BLOK_EINDE As String = "*/" 'Staat voor het einde van een SQL-commentaarblok.
Private Const SQL_COMMENTAAR_REGEL_BEGIN As String = "--" 'Staat voor het begin van een SQL-commentaarregel.
Private Const SQL_COMMENTAAR_REGEL_EINDE As String = Nothing 'Staat voor het einde van een SQL-commentaarregel.
Private Const SYMBOOL_TEKEN As Char = "*"c 'Geeft het begin en het einde van een symbool in een tekst aan.
Private Const TEKENREEKS_TEKENS As String = "'""" 'Staat voor de tekens die het begin en einde van een tekenreeks aanduiden.
Private Const VARIABELE_LENGTE_TEKEN As Char = "*"c 'Indien aanwezig aan het begin van een masker geeft dit teken aan dat de invoer lengte variabel is.
Private Const VERBINDING_AFSCHEIDING_BEGIN As Char = "("c 'Scheidt de verbindingsinformatieparameters van elkaar.
Private Const VERBINDING_AFSCHEIDING_EINDE As Char = ")"c 'Scheidt de verbindingsinformatieparameters van elkaar.
Private Const VERBINDING_PARAMETER_TEKEN As Char = ";"c 'Scheidt de verbindingsinformatieparameters van elkaar.
Private Const WAARDE_TEKEN As Char = "="c 'Scheidt de naam en waarde van een instellingenparameter van elkaar.
Public ReadOnly BATCH_MODUS_ACTIEF As Func(Of Boolean) = Function() Not (Instellingen().BatchBereik = Nothing OrElse Instellingen().BatchQueryPad = Nothing) 'Geeft aan of de batchmodus actief is.
Public ReadOnly BITS_MODUS As String = $"{If(Is64BitProcess, "64", "32")}-bits" 'Geeft de bits-modus voor dit programma op. (32-bits of 64-bits).
Public ReadOnly OPDRACHT_REGEL As String = String.Join(" "c, GetCommandLineArgs.Skip(1)) 'Bevat de eventuele opdrachtregelparameters.
Public ReadOnly PROGRAMMA_VERSIE As String = $"v{My.Application.Info.Version} ({BITS_MODUS})" 'Bevat programma versie informatie.
Public ReadOnly TOON_VERBINDINGS_STATUS As Action = Sub() ToonStatus(String.Format(If(VERBINDING_GEOPEND(Verbinding), "Verbonden met de database. - Instellingen: {0}{1}", "Er is geen verbinding met een database.{0}{1}"), Instellingen().Bestand, NewLine)) 'Deze procedure toont de verbindingsstatus.
Public ReadOnly VERBINDING_GEOPEND As Func(Of Connection, Boolean) = Function(VerbindingO As Connection) If(VerbindingO IsNot Nothing, VerbindingO.State = ObjectStateEnum.adStateOpen, False) 'Deze procedure geeft aan of de opgegeven verbinding geopend is.
Private ReadOnly INTERACTIEVE_BATCH_PARAMETERS As New List(Of String) 'Bevat de interactieve batch parameters.
Private ReadOnly IS_INSTELLINGS_SECTIE As Func(Of String, Boolean) = Function(Regel As String) Regel.Trim().StartsWith(SECTIE_NAAM_BEGIN) AndAlso Regel.Trim().EndsWith(SECTIE_NAAM_EINDE) 'Deze procedure geeft aan of de opgegeven regel een instellingen sectie naam bevat.
Private ReadOnly LINKS_UITGELIJNDE_DATA_TYPES As New List(Of DataTypeEnum)({DataTypeEnum.adBSTR, DataTypeEnum.adChar, DataTypeEnum.adDBDate, DataTypeEnum.adDBTime, DataTypeEnum.adDBTimeStamp, DataTypeEnum.adLongVarChar, DataTypeEnum.adLongVarWChar, DataTypeEnum.adVarChar, DataTypeEnum.adVarWChar, DataTypeEnum.adWChar}) 'Bevat een lijst van databasedatatypes die linksuitgelijnd worden.
Private ReadOnly RECORDSET_GEOPEND As Func(Of Recordset, Boolean) = Function(RecordsetO As Recordset) If(RecordsetO IsNot Nothing, RecordsetO.State = ObjectStateEnum.adStateOpen, False) 'Deze procedure geeft aan of de opgegeven recordset geopend is.
Private ReadOnly SESSIE_PARAMETERS As New List(Of String) 'Bevat de sessieparameters.
Public HuidigInterfaceVenster As Form = Nothing 'Bevat de verwijzing naar een eventueel interface venster.
Public InteractieveBatchAfbreken As Boolean = False 'Geeft aan of een interactive batch moet worden afgebroken.
Public InteractieveBatchModusActief As Boolean = InteractieveBatchModusActief = Instellingen.BatchInteractief AndAlso BATCH_MODUS_ACTIEF() 'Geeft aan of de interactieve batchmodus actief is.
Public SessiesAfbreken As Boolean = False 'Geeft aan of een reeks sessies is afgebroken.
'Deze procedure bewaart de instellingen van dit programma.
Private Sub BewaarInstellingen(InstellingenPad As String, TeBewarenInstellingen As InstellingenDefinitie, Bericht As String)
Try
Dim BewaardeInstellingen As New List(Of String)
With TeBewarenInstellingen
BewaardeInstellingen.Add($"{SECTIE_NAAM_BEGIN}BATCH{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add($"Bereik{WAARDE_TEKEN}{ .BatchBereik}")
BewaardeInstellingen.Add($"Interactief{WAARDE_TEKEN}{ .BatchInteractief}")
BewaardeInstellingen.Add($"QueryPad{WAARDE_TEKEN}{ .BatchQueryPad}")
BewaardeInstellingen.Add(NewLine)
BewaardeInstellingen.Add($"{SECTIE_NAAM_BEGIN}EMAILTEKST{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add(.EMailTekst.ToString())
BewaardeInstellingen.Add(NewLine)
BewaardeInstellingen.Add($"{SECTIE_NAAM_BEGIN}EXPORT{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add($"Afzender{WAARDE_TEKEN}{ .ExportAfzender}")
BewaardeInstellingen.Add($"AutoOpenen{WAARDE_TEKEN}{ .ExportAutoOpenen}")
BewaardeInstellingen.Add($"AutoOverschrijven{WAARDE_TEKEN}{ .ExportAutoOverschrijven}")
BewaardeInstellingen.Add($"AutoVerzenden{WAARDE_TEKEN}{ .ExportAutoVerzenden}")
BewaardeInstellingen.Add($"CCOntvanger{WAARDE_TEKEN}{ .ExportCCOntvanger}")
BewaardeInstellingen.Add($"KolomAanvullen{WAARDE_TEKEN}{ .ExportKolomAanvullen}")
BewaardeInstellingen.Add($"Onderwerp{WAARDE_TEKEN}{ .ExportOnderwerp}")
BewaardeInstellingen.Add($"Ontvanger{WAARDE_TEKEN}{ .ExportOntvanger}")
BewaardeInstellingen.Add($"StandaardPad{WAARDE_TEKEN}{ .ExportStandaardPad}")
BewaardeInstellingen.Add(NewLine)
BewaardeInstellingen.Add($"{SECTIE_NAAM_BEGIN}QUERY{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add($"AutoSluiten{WAARDE_TEKEN}{ .QueryAutoSluiten}")
BewaardeInstellingen.Add($"AutoUitvoeren{WAARDE_TEKEN}{ .QueryAutoUitvoeren}")
BewaardeInstellingen.Add($"Recordsets{WAARDE_TEKEN}{ .QueryRecordSets}")
BewaardeInstellingen.Add($"Timeout{WAARDE_TEKEN}{ .QueryTimeout}")
BewaardeInstellingen.Add(NewLine)
BewaardeInstellingen.Add($"{SECTIE_NAAM_BEGIN}VERBINDING{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add(.VerbindingsInformatie.ToString())
BewaardeInstellingen.Add(NewLine)
BewaardeInstellingen.Add($"{ SECTIE_NAAM_BEGIN}VOORBEELD{SECTIE_NAAM_EINDE}")
BewaardeInstellingen.Add($"KolomBreedte{WAARDE_TEKEN}{ .VoorbeeldKolomBreedte}")
BewaardeInstellingen.Add($"Regels{WAARDE_TEKEN}{ .VoorbeeldRegels}")
End With
Do
Try
File.WriteAllLines(InstellingenPad, BewaardeInstellingen)
Exit Do
Catch
If HandelFoutAf() = DialogResult.Ignore Then Exit Do
End Try
Loop
MessageBox.Show($"{Bericht}{NewLine}{InstellingenPad}", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Information)
Catch
HandelFoutAf()
End Try
End Sub
'Deze procedure stuurt de Microsoft Excel kolom id. voor het opgegeven kolom nummer terug.
Private Function ExcelKolomId(Kolom As Integer) As String
Try
If Kolom >= 0 AndAlso Kolom <= EXCEL_MAXIMUM_AANTAL_KOLOMMEN Then
For Letter1 As Integer = GEEN_LETTER To ASCII_Z
For Letter2 As Integer = ASCII_A To ASCII_Z
If Kolom = 0 Then Return If(Letter1 = GEEN_LETTER, ToChar(Letter2), $"{Letter1}{Letter2}")
Kolom -= 1
Next Letter2
Next Letter1
End If
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure exporteert het queryresultaat naar een tekstbestand.
Private Function ExporteerAlsTekst(ExportPad As String, Optional CSV As Boolean = False) As Boolean
Dim ExportAfgebroken As Boolean = False
Try
Dim GeexporteerdeTekst As New StringBuilder
For ResultaatIndex As Integer = 0 To QueryResultaten().Count - 1
With QueryResultaten()(ResultaatIndex)
If .Tabel IsNot Nothing Then
If QueryResultaten().Count > 1 Then GeexporteerdeTekst.Append($"[Resultaat: #{ResultaatIndex + 1}]{NewLine}")
For Rij As Integer = 0 To .Tabel.GetUpperBound(0)
For Kolom As Integer = 0 To .Tabel.GetUpperBound(1)
If .Tabel(Rij, Kolom) = Nothing Then .Tabel(Rij, Kolom) = ""
If CSV Then
GeexporteerdeTekst.Append($"{ If(.Tabel(Rij, Kolom).Contains(CSV_SCHEIDINGSTEKEN), $"""{ .Tabel(Rij, Kolom).Replace("""", """""")}""", .Tabel(Rij, Kolom))}{CSV_SCHEIDINGSTEKEN}")
Else
If Instellingen().ExportKolomAanvullen Then
GeexporteerdeTekst.Append(If(.RechtsUitlijnen(Kolom), .Tabel(Rij, Kolom).PadLeft(.KolomBreedte(Kolom)), .Tabel(Rij, Kolom).PadRight(.KolomBreedte(Kolom))))
Else
GeexporteerdeTekst.Append($"{ .Tabel(Rij, Kolom)}{Microsoft.VisualBasic.ControlChars.Tab}")
End If
End If
Next Kolom
GeexporteerdeTekst.Append(NewLine)
Next Rij
End If
End With
Next ResultaatIndex
Do
Try
File.WriteAllText(ExportPad, GeexporteerdeTekst.ToString())
Exit Do
Catch
If HandelFoutAf(TypePad:="Export pad: ", Pad:=ExportPad) = DialogResult.Ignore Then
ExportAfgebroken = True
Exit Do
End If
End Try
Loop
Return ExportAfgebroken
Catch
ExportAfgebroken = True
HandelFoutAf()
End Try
Return ExportAfgebroken
End Function
'Deze procedure exporteert het queryresultaat naar een Microsoft Excel werkmap.
Private Function ExporteerNaarExcel(ExportPad As String, ExcelFormaat As Excel.XlFileFormat) As Boolean
Dim ExportAfgebroken As Boolean = False
Try
Dim KolomId As String = Nothing
Dim MSExcel As New Excel.Application
Dim WerkBlad As Excel.Worksheet = Nothing
Dim WerkMap As Excel.Workbook = Nothing
MSExcel.DisplayAlerts = False
MSExcel.Interactive = False
MSExcel.ScreenUpdating = False
MSExcel.Workbooks.Add()
WerkMap = MSExcel.Workbooks.Item(1)
WerkMap.Activate()
Do Until WerkMap.Worksheets.Count <= 1
DirectCast(WerkMap.Worksheets.Item(WerkMap.Worksheets.Count), Excel.Worksheet).Delete()
Loop
Do Until WerkMap.Worksheets.Count >= QueryResultaten().Count
WerkMap.Worksheets.Add()
Loop
For ResultaatIndex As Integer = 0 To QueryResultaten().Count - 1
With QueryResultaten()(ResultaatIndex)
If .Tabel IsNot Nothing Then
If .Tabel.GetUpperBound(1) > EXCEL_MAXIMUM_AANTAL_KOLOMMEN Then
MessageBox.Show($"Het queryresultaat bevat te veel kolommen om deze naar Microsoft Excel te exporteren.{NewLine}Het maximaal toegestane aantal kolommen is: {EXCEL_MAXIMUM_AANTAL_KOLOMMEN}", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
WerkBlad = DirectCast(WerkMap.Worksheets.Item(ResultaatIndex + 1), Excel.Worksheet)
WerkBlad.Activate()
If QueryResultaten().Count > 0 Then WerkBlad.Name = $"Resultaat {ResultaatIndex + 1}"
WerkBlad.Range($"A1:{ExcelKolomId(.Tabel.GetUpperBound(1))}{ .Tabel.GetUpperBound(0) + 1}").Value = .Tabel
For Kolom As Integer = 0 To .Tabel.GetUpperBound(1)
KolomId = ExcelKolomId(Kolom)
WerkBlad.Range($"{KolomId}1:{KolomId}1").Font.Bold = True
If .RechtsUitlijnen(Kolom) Then WerkBlad.Range($"{KolomId}1:{KolomId}{ .Tabel.GetUpperBound(0) + 1}").HorizontalAlignment = Excel.Constants.xlRight
Next Kolom
WerkBlad.Range($"A:{ExcelKolomId(.Tabel.GetUpperBound(1))}").Columns.AutoFit()
End If
End If
End With
Next ResultaatIndex
DirectCast(WerkMap.Worksheets.Item(1), Excel.Worksheet).Activate()
Do
Try
WerkMap.SaveAs(ExportPad, ExcelFormaat)
Exit Do
Catch
If HandelFoutAf(TypePad:="Export pad: ", Pad:=ExportPad) = DialogResult.Ignore Then
ExportAfgebroken = True
Exit Do
End If
End Try
Loop
WerkMap.Close()
If Not MSExcel Is Nothing Then
MSExcel.Quit()
MSExcel.DisplayAlerts = True
MSExcel.Interactive = True
MSExcel.ScreenUpdating = True
End If
MSExcel = Nothing
WerkBlad = Nothing
WerkMap = Nothing
Return ExportAfgebroken
Catch
ExportAfgebroken = True
HandelFoutAf()
End Try
Return ExportAfgebroken
End Function
'Deze procedure exporteert het queryresultaat.
Public Function ExporteerResultaat(ExportPad As String) As Boolean
Dim ExportAfgebroken As Boolean = False
Try
Dim BestandsType As String = Path.GetExtension(ExportPad.Trim().ToLower())
If File.Exists(ExportPad) Then
If Not Instellingen().ExportAutoOverschrijven Then
If MessageBox.Show($"Het bestand ""{ExportPad}"" bestaat al. Overschrijven?", My.Application.Info.Title, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.No Then ExportAfgebroken = True
End If
If Not ExportAfgebroken Then
If BestandsType = ".xls" OrElse BestandsType = ".xlsx" Then DirectCast(Microsoft.VisualBasic.GetObject(ExportPad), Excel.Workbook).Close(SaveChanges:=False)
File.Delete(ExportPad)
End If
End If
If Not ExportAfgebroken Then
Select Case BestandsType
Case ".csv"
ExportAfgebroken = ExporteerAlsTekst(ExportPad, CSV:=True)
Case ".xls"
ExportAfgebroken = ExporteerNaarExcel(ExportPad, Excel.XlFileFormat.xlWorkbookNormal)
Case ".xlsx"
ExportAfgebroken = ExporteerNaarExcel(ExportPad, Excel.XlFileFormat.xlWorkbookDefault)
Case Else
ExportAfgebroken = ExporteerAlsTekst(ExportPad)
End Select
End If
Return Not ExportAfgebroken
Catch
ExportAfgebroken = True
HandelFoutAf()
End Try
Return Not ExportAfgebroken
End Function
'Deze procedure zet de opgegeven foutenlijst om naar tekst.
Public Function FoutenLijstTekst(Lijst As Errors) As String
Try
Dim Tekst As New StringBuilder
Tekst.Append("Er ")
If Lijst.Count = 1 Then Tekst.Append("is 1 fout ") Else Tekst.Append($"zijn {Lijst.Count} fouten")
Tekst.Append($" opgetreden tijdens het uitvoeren van de query:{NewLine}")
Tekst.Append($"{"Native",-11}{"Code",-11}{"Bron",-36}{"SQL Status",-11}Omschrijving{NewLine}")
For Each Fout As ADODB.Error In Lijst
With Fout
Tekst.Append($"{ .NativeError,10} { .Number,10} { .Source,-35} { .SQLState,10} { .Description}{NewLine}")
End With
Next Fout
Return Tekst.ToString()
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure handelt eventuele fouten af.
Public Function HandelFoutAf(Optional TypePad As String = Nothing, Optional Pad As String = Nothing, Optional ExtraInformatie As String = Nothing) As DialogResult
Dim Bron As String = Microsoft.VisualBasic.Err.Source
Dim FoutCode As Integer = Microsoft.VisualBasic.Err.Number
Dim FoutOmschrijving As String = Microsoft.VisualBasic.Err.Description
Static Keuze As DialogResult = DialogResult.Retry
Try
Dim Bericht As New StringBuilder
Microsoft.VisualBasic.Err.Clear()
Bericht.Append($"{MaakFoutOmschrijvingOp(FoutOmschrijving)}{NewLine}Foutcode: {FoutCode}")
If Bron IsNot Nothing Then Bericht.Append($"{NewLine}Bron: ""{Bron}""")
Bericht.Append($"{NewLine}Procedure: ""{(New StackTrace).GetFrames().Skip(1).First().GetMethod().Name}""")
If TypePad IsNot Nothing AndAlso Pad IsNot Nothing Then Bericht.Append($"{NewLine}{TypePad}""{Path.GetFullPath(Pad)}""")
If ExtraInformatie IsNot Nothing Then Bericht.Append($"{NewLine}{ExtraInformatie}")
Keuze = MessageBox.Show(Bericht.ToString(), $"{My.Application.Info.Title} ({BITS_MODUS})", MessageBoxButtons.AbortRetryIgnore, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button2)
Return Keuze
Catch
End
Finally
If Keuze = DialogResult.Abort Then End
End Try
Return Nothing
End Function
'Deze procedure stuurt de instellingen voor dit programma terug.
Public Function Instellingen(Optional InstellingenPad As String = Nothing) As InstellingenDefinitie
Try
Static ProgrammaInstellingen As InstellingenDefinitie = StandaardInstellingen()
If Not InstellingenPad = Nothing Then
If File.Exists(InstellingenPad) Then
ProgrammaInstellingen = LaadInstellingen(InstellingenPad)
Else
If MessageBox.Show($"Kan het instellingenbestand niet vinden.{NewLine}Instellingenbestand: ""{InstellingenPad}""{NewLine}Dit bestand genereren?{NewLine}Huidig pad: ""{Directory.GetCurrentDirectory()}""", My.Application.Info.Title, MessageBoxButtons.YesNo, MessageBoxIcon.Question, MessageBoxDefaultButton.Button2) = DialogResult.Yes Then
BewaarInstellingen(InstellingenPad, StandaardInstellingen(), "De standaardinstellingen zijn weggeschreven naar:")
ProgrammaInstellingen = LaadInstellingen(InstellingenPad)
End If
End If
End If
Return ProgrammaInstellingen
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure toont instellingsbestand gerelateerde foutmeldingen.
Private Function InstellingenFout(Bericht As StringBuilder, Optional InstellingenPad As String = Nothing, Optional Sectie As String = Nothing, Optional Regel As String = Nothing, Optional Fataal As Boolean = False) As Integer
Try
If Sectie IsNot Nothing Then Bericht.Append($"{NewLine}Sectie: {Sectie}")
If Regel IsNot Nothing Then Bericht.Append($"{NewLine}Regel: ""{Regel}""")
If InstellingenPad IsNot Nothing Then Bericht.Append($"{NewLine}Instellingenbestand: ""{InstellingenPad}""")
If Fataal Then
Return MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
Return MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OKCancel, MessageBoxIcon.Exclamation, MessageBoxDefaultButton.Button1)
End If
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure laadt de instellingen voor dit programma.
Private Function LaadInstellingen(InstellingenPad As String) As InstellingenDefinitie
Try
Dim Afbreken As Boolean = False
Dim GeladenInstellingen As New List(Of String)
Dim ParameterNaam As String = Nothing
Dim ProgrammaInstellingen As InstellingenDefinitie = StandaardInstellingen()
Dim RecensteGeldigeSectie As String = Nothing
Dim Sectie As String = Nothing
Dim VerbindingsInformatie As String = Nothing
Dim VerwerkteParameters As New List(Of String)
Dim VerwerkteSecties As New List(Of String)
Do
Try
With ProgrammaInstellingen
.Bestand = InstellingenPad
For Each Regel As String In File.ReadAllLines(.Bestand)
If Afbreken Then Exit For
If Not Regel.Trim().StartsWith(COMMENTAAR_TEKEN) Then
If IS_INSTELLINGS_SECTIE(Regel) Then
Regel = Regel.Trim()
RecensteGeldigeSectie = Sectie
Sectie = Regel.Substring(SECTIE_NAAM_BEGIN.Length, Regel.Length - (SECTIE_NAAM_BEGIN.Length + SECTIE_NAAM_EINDE.Length)).ToUpper()
If VerwerkteSecties.Contains(Sectie) Then
If InstellingenFout(New StringBuilder("Sectie is meerdere keren aanwezig."), InstellingenPad, Sectie, Regel) = DialogResult.Cancel Then Afbreken = True
Else
VerwerkteSecties.Add(Sectie)
End If
VerwerkteParameters.Clear()
Else
Select Case Sectie
Case "BATCH", "EXPORT", "QUERY", "VOORBEELD"
If Not Regel.Trim() = Nothing Then
LeesParameter(Regel, ParameterNaam)
If VerwerkteParameters.Contains(ParameterNaam) Then
If InstellingenFout(New StringBuilder("Parameter is meerdere keren aanwezig."), InstellingenPad, Sectie, Regel) = DialogResult.Cancel Then Afbreken = True
Else
VerwerkteParameters.Add(ParameterNaam)
End If
End If
End Select
End If
Select Case Sectie
Case "BATCH"
If Not (IS_INSTELLINGS_SECTIE(Regel) OrElse Regel.Trim() = Nothing) Then
If Not VerwerkBatchInstellingen(Regel, Sectie, ProgrammaInstellingen) Then Afbreken = True
End If
Case "EMAILTEKST"
If Not IS_INSTELLINGS_SECTIE(Regel) Then .EMailTekst.Append($"{Regel}{NewLine}")
Case "EXPORT"
If Not (IS_INSTELLINGS_SECTIE(Regel) OrElse Regel.Trim() = Nothing) Then
If Not VerwerkExportInstellingen(Regel, Sectie, ProgrammaInstellingen) Then Afbreken = True
End If
Case "QUERY"
If Not (IS_INSTELLINGS_SECTIE(Regel) OrElse Regel.Trim() = Nothing) Then
If Not VerwerkQueryInstellingen(Regel, Sectie, ProgrammaInstellingen) Then Afbreken = True
End If
Case "VERBINDING"
If Not (IS_INSTELLINGS_SECTIE(Regel) OrElse Regel.Trim() = Nothing) Then .VerbindingsInformatie.Append(Regel.Trim())
Case "VOORBEELD"
If Not (IS_INSTELLINGS_SECTIE(Regel) OrElse Regel.Trim() = Nothing) Then
If Not VerwerkVoorbeeldInstellingen(Regel, Sectie, ProgrammaInstellingen) Then Afbreken = True
End If
Case Else
If Not Regel.Trim() = Nothing Then
If IS_INSTELLINGS_SECTIE(Regel) Then
Sectie = RecensteGeldigeSectie
If InstellingenFout(New StringBuilder("Niet herkende sectie."), InstellingenPad, Sectie, Regel) = DialogResult.Cancel Then Afbreken = True
Else
If InstellingenFout(New StringBuilder("Niet herkende parameter."), InstellingenPad, Sectie, Regel) = DialogResult.Cancel Then Afbreken = True
End If
End If
End Select
End If
Next Regel
If .VerbindingsInformatie.ToString() = Nothing AndAlso Not Afbreken Then
VerbindingsInformatie = VraagVerbindingsInformatie().Trim()
If Not VerbindingsInformatie = Nothing Then
.VerbindingsInformatie = New StringBuilder(VerbindingsInformatie)
BewaarInstellingen(InstellingenPad, ProgrammaInstellingen, "De instellingen zijn weggeschreven naar:")
End If
End If
.VerbindingsInformatie = New StringBuilder(MaakVerbindingsInformatieOp(.VerbindingsInformatie.ToString()))
End With
Exit Do
Catch
If HandelFoutAf() = DialogResult.Ignore Then Exit Do
End Try
Loop
Return ProgrammaInstellingen
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure stuurt de waarde en de naam van een instellingenparameter in de opgegeven regel terug.
Private Function LeesParameter(Regel As String, ByRef ParameterNaam As String) As String
Try
Dim Positie As Integer = Regel.IndexOf(WAARDE_TEKEN)
Dim Waarde As String = Nothing
ParameterNaam = Nothing
If Positie >= 0 Then
ParameterNaam = Regel.Substring(0, Positie).Trim().ToLower()
Waarde = Regel.Substring(Positie + 1).Trim()
End If
Return Waarde
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure maakt de opgegeven foutomschrijving op.
Private Function MaakFoutOmschrijvingOp(FoutOmschrijving As String) As String
Try
Dim Omschrijving As String = FoutOmschrijving.Trim()
Do
Select Case Omschrijving.ToCharArray().Last()
Case Microsoft.VisualBasic.ControlChars.Cr, Microsoft.VisualBasic.ControlChars.Lf
Omschrijving = Omschrijving.Substring(0, Omschrijving.Length - 1).Trim()
Case Else
Exit Do
End Select
Loop
If Not Omschrijving.EndsWith("."c) Then Omschrijving.Append("."c)
Return Omschrijving
Catch
End Try
Return Nothing
End Function
'Deze procedure controleert de opgegeven verbindingsinformatie en maakt deze op.
Private Function MaakVerbindingsInformatieOp(VerbindingsInformatie As String) As String
Try
Dim HuidigAfscheidingsTeken As Char = Nothing
Dim HuidigStringTeken As Char = Nothing
Dim OpgemaakteVerbindingsInformatie As New StringBuilder
Dim Parameter As String = Nothing
Dim ParameterBegin As New Integer
Dim ParameterNaam As String = Nothing
Dim ParameterNamen As New List(Of String)
Dim Positie As Integer = 0
Dim Teken As New Char
Dim Waarde As String = Nothing
If Not VerbindingsInformatie.Trim() = Nothing Then
ParameterBegin = Positie
If Not VerbindingsInformatie.Trim().EndsWith(VERBINDING_PARAMETER_TEKEN) Then VerbindingsInformatie = $"{VerbindingsInformatie}{VERBINDING_PARAMETER_TEKEN}"
Do Until Positie >= VerbindingsInformatie.Length
Teken = VerbindingsInformatie.Chars(Positie)
If TEKENREEKS_TEKENS.Contains(Teken) Then
If HuidigStringTeken = Nothing Then
HuidigStringTeken = Teken
ElseIf Teken = HuidigStringTeken Then
HuidigStringTeken = Nothing
End If
ElseIf (Teken = VERBINDING_AFSCHEIDING_BEGIN OrElse Teken = VERBINDING_AFSCHEIDING_EINDE) AndAlso HuidigStringTeken = Nothing Then
If Teken = VERBINDING_AFSCHEIDING_BEGIN AndAlso HuidigAfscheidingsTeken = Nothing Then
HuidigAfscheidingsTeken = Teken
ElseIf Teken = VERBINDING_AFSCHEIDING_EINDE AndAlso HuidigAfscheidingsTeken = VERBINDING_AFSCHEIDING_BEGIN Then
HuidigAfscheidingsTeken = Nothing
Else
MessageBox.Show($"Ongeldig afscheidingsteken in verbindingsinformatie: ""{Teken}"".", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return Nothing
End If
ElseIf Teken = VERBINDING_PARAMETER_TEKEN AndAlso HuidigAfscheidingsTeken = Nothing AndAlso HuidigStringTeken = Nothing Then
Parameter = VerbindingsInformatie.Substring(ParameterBegin, Positie - ParameterBegin)
If Not Parameter.Contains(WAARDE_TEKEN) Then
MessageBox.Show($"Ongeldige parameter aanwezig in verbindingsinformatie: ""{Parameter}"". Verwacht teken: {WAARDE_TEKEN}", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return Nothing
End If
Waarde = LeesParameter(Parameter, ParameterNaam)
If ParameterNamen.Contains(ParameterNaam) Then
MessageBox.Show($"Parameter meerdere malen aanwezig in verbindingsinformatie: ""{Parameter}"".", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return Nothing
Else
ParameterNamen.Add(ParameterNaam)
End If
ParameterBegin = Positie + 1
OpgemaakteVerbindingsInformatie.Append($"{ParameterNaam}{WAARDE_TEKEN}{Waarde.Trim()}{VERBINDING_PARAMETER_TEKEN}")
End If
Positie += 1
Loop
If Not HuidigStringTeken = Nothing Then
MessageBox.Show($"Niet afgesloten tekenreekswaarde in verbindingsgegevens. Verwacht teken: {HuidigStringTeken}", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Return Nothing
End If
End If
Return OpgemaakteVerbindingsInformatie.ToString()
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure wordt uitgevoerd wanneer dit programma wordt gestart.
Public Sub Main()
Try
Dim InstellingenPad As String = Nothing
Directory.SetCurrentDirectory(My.Application.Info.DirectoryPath)
With OpdrachtRegelParameters(OPDRACHT_REGEL)
If .Verwerkt Then
If .InstellingenPad.Trim().StartsWith(PARAMETER_TEKEN) Then
InstellingenPad = .InstellingenPad.Trim().Substring(0, PARAMETER_TEKEN.ToString().Length + 1).Trim(""""c)
If InstellingenPad = Nothing Then
MessageBox.Show("Kan de instellingen niet bewaren. Geen doel bestand opgegeven.", My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
BewaarInstellingen(InstellingenPad, StandaardInstellingen(), "De standaardinstellingen zijn weggeschreven naar:")
End If
ElseIf Not .SessiesPad = Nothing Then
SESSIE_PARAMETERS.Clear()
VerwerkSessieLijst(.SessiesPad)
Else
SESSIE_PARAMETERS.Clear()
VoerSessieUit(OPDRACHT_REGEL)
End If
End If
End With
Catch
HandelFoutAf()
Finally
Verbinding(, VerbindingSluiten:=True)
SluitAlleVensters()
End Try
End Sub
'Deze procedure controleert de queryparameter invoer en stuurt eventueel de index van een onjuist ingevuld veld en een foutomschrijving terug.
Private Function OngeldigeParameterInvoer(Optional ByRef FoutInformatie As String = Nothing) As Integer?
Try
Dim Lengte As New Integer
Dim OngeldigVeld As Integer? = Nothing
For ParameterIndex As Integer = 0 To QueryParameters().Count - 1
With QueryParameters()(ParameterIndex)
If .Masker = Nothing Then
Lengte = .Invoer.Length
Else
Lengte = If(.LengteIsVariabel, ParameterInvoerLengte(ParameterIndex), .Masker.Length)
For Positie As Integer = 0 To Lengte - 1
FoutInformatie = ParameterMaskerTekenGeldig(.Invoer.Chars(Positie), .Masker.Chars(Positie))
If FoutInformatie IsNot Nothing Then
FoutInformatie = $"{NewLine}""{FoutInformatie}"".{NewLine}Teken positie: {Positie + 1}."
OngeldigVeld = ParameterIndex
Exit For
End If
Next Positie
End If
If OngeldigVeld IsNot Nothing Then Exit For
QueryParameters(, ParameterIndex, .Invoer.Substring(0, Lengte))
End With
Next ParameterIndex
If OngeldigVeld IsNot Nothing Then
For ParameterIndex As Integer = 0 To QueryParameters().Count - 1
QueryParameters(, ParameterIndex, "")
Next ParameterIndex
End If
Return OngeldigVeld
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure beheert de huidige sessie's opdrachtregelparameters.
Public Function OpdrachtRegelParameters(Optional SessieParameters As String = Nothing) As OpdrachtRegelParametersDefinitie
Try
Dim Bericht As New StringBuilder
Dim Extensie As String = Nothing
Dim Extensies As New List(Of String)
Dim Positie As Integer = 0
Static HuidigeOpdrachtRegelParameters As New OpdrachtRegelParametersDefinitie With {.InstellingenPad = "", .QueryPad = Nothing, .SessiesPad = Nothing, .Verwerkt = True}
With HuidigeOpdrachtRegelParameters
If SessieParameters IsNot Nothing Then
Extensies.Clear()
Positie = SessieParameters.IndexOf(New String(PARAMETER_TEKEN, 2))
If Positie >= 0 Then
.InstellingenPad = SessieParameters.Substring(Positie + PARAMETER_TEKEN.ToString().Length)
Else
For Each Parameter As String In SessieParameters.Split(PARAMETER_TEKEN)
If Not Parameter.Trim() = Nothing Then
Parameter = Parameter.Trim(""""c)
Extensie = Path.GetExtension(Parameter).ToLower()
If Not Extensies.Contains(Extensie) Then
Extensies.Add(Extensie)
Select Case Extensie
Case ".ini"
.InstellingenPad = Parameter
Case ".lst"
.SessiesPad = Parameter
Case ".txt"
.QueryPad = Parameter
Case Else
If Not Parameter.Trim() = Nothing Then
Bericht = New StringBuilder($"Niet herkende opdrachtregelparameter: ""{Parameter}"".")
If VerwerkSessieLijst() = Nothing Then
MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Else
Bericht.Append($"{NewLine}Sessielijst: ""{VerwerkSessieLijst()}"".")
If MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation) = DialogResult.Cancel Then SessiesAfbreken = True
End If
.Verwerkt = False
End If
End Select
Else
Bericht = New StringBuilder("Er kan maar een instellingenbestand en/of query tegelijk opgegeven worden.")
If Not VerwerkSessieLijst() = Nothing Then Bericht.Append($"{NewLine}Sessielijst: ""{VerwerkSessieLijst()}"".")
MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
.Verwerkt = False
End If
End If
Next Parameter
End If
End If
End With
Return HuidigeOpdrachtRegelParameters
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure stuurt de lengte van de invoer voor de opgegeven queryparameter terug.
Private Function ParameterInvoerLengte(ParameterIndex As Integer) As Integer
Try
Dim Lengte As Integer = 0
With QueryParameters()(ParameterIndex)
For Positie As Integer = 0 To .Invoer.Length - 1
If Not .Invoer.Chars(Positie) = .Masker.Chars(Positie) Then Lengte = Positie + 1
Next Positie
End With
Return Lengte
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure vergelijkt het opgegeven teken met het opgegeven queryparametermaskerteken.
Public Function ParameterMaskerTekenGeldig(Teken As Char, MaskerTeken As Char) As String
Try
Dim Geldig As String = Nothing
Select Case MaskerTeken
Case MASKER_CIJFER
If Not (Teken >= "0"c AndAlso Teken <= "9"c) Then Geldig = "Cijfer verwacht."
Case MASKER_HOOFDLETTER
If Not (Teken >= "A"c AndAlso Teken <= "Z"c) Then Geldig = "Hoofdletter verwacht."
Case Else
If Not Teken = MaskerTeken Then Geldig = $"Vast maskerteken ""{ MaskerTeken}"" verwacht."
End Select
Return Geldig
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure controleert de door de gebruiker ingevoerde parameters en stuurt het resultaat terug.
Public Function ParametersGeldig(ParameterVelden As List(Of Object)) As Boolean
Try
Dim FoutInformatie As String = Nothing
Dim Geldig As Boolean = False
Dim OngeldigeVeldIndex As Integer? = Nothing
For ParameterIndex As Integer = 0 To ParameterVelden.Count - 1
QueryParameters(, ParameterIndex, DirectCast(ParameterVelden(ParameterIndex), TextBox).Text)
Next ParameterIndex
OngeldigeVeldIndex = OngeldigeParameterInvoer(FoutInformatie)
Geldig = (OngeldigeVeldIndex Is Nothing)
If Not Geldig Then
With DirectCast(ParameterVelden(OngeldigeVeldIndex.Value), TextBox)
If .Visible Then
FoutInformatie = $"Dit veld is niet volledig of onjuist ingevuld:{FoutInformatie}"
Else
FoutInformatie = $"Onzichtbare parameter #{OngeldigeVeldIndex.Value} is niet volledig of onjuist ingevuld:{FoutInformatie}"
End If
MessageBox.Show(FoutInformatie, My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
If .Visible Then .Focus()
End With
End If
Return Geldig
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure toont parameter en/of symbool gerelateerde foutmeldingen.
Private Sub ParameterSymboolFout(Bericht As StringBuilder, Optional ParameterIndex As Integer? = Nothing)
Try
If ParameterIndex IsNot Nothing Then
Bericht.Append($"{NewLine}Parameter definitie: #{ParameterIndex + 1}")
With QueryParameters()(ParameterIndex.Value)
If .ParameterNaam IsNot Nothing Then Bericht.Append($"{NewLine} Naam: ""{ .ParameterNaam}""")
If .Invoer IsNot Nothing Then Bericht.Append($"{NewLine}Invoer: ""{ .Invoer}""")
If .StandaardWaarde IsNot Nothing Then Bericht.Append($"{NewLine}Standaardwaarde: ""{ .StandaardWaarde}""")
If .Masker IsNot Nothing Then Bericht.Append($"{NewLine}Masker: ""{ .Masker}""")
End With
End If
If Not Query().Pad = Nothing Then Bericht.Append($"{ NewLine}Query: ""{Query().Pad}""")
MessageBox.Show(Bericht.ToString(), My.Application.Info.Title, MessageBoxButtons.OK, MessageBoxIcon.Exclamation)
Catch
HandelFoutAf()
End Try
End Sub
'Deze procedure laadt de opgegeven query of stuurt een al geladen query terug.
Public Function Query(Optional QueryPad As String = Nothing) As QueryDefinitie
Try
Static HuidigeQuery As New QueryDefinitie With {.Code = Nothing, .Geopend = False, .Pad = Nothing}
Do
With HuidigeQuery
Try
.Geopend = False
If Not QueryPad = Nothing Then
.Code = New String((From ByteO In File.ReadAllBytes(QueryPad) Select ToChar(ByteO)).ToArray())
.Pad = QueryPad
.Geopend = True
End If
Exit Do
Catch
.Geopend = False
If HandelFoutAf(TypePad:="Query pad: ", Pad:=QueryPad) = DialogResult.Ignore Then Exit Do
End Try
End With
Loop
Return HuidigeQuery
Catch
HandelFoutAf()
End Try
Return Nothing
End Function
'Deze procedure doorzoekt de opgegeven query op parameterdefinities of stuurt een eerder gevonden parameterdefinitie terug.
Public Function QueryParameters(Optional QueryCode As String = Nothing, Optional ParameterIndex As Integer = 0, Optional Invoer As String = Nothing) As List(Of QueryParameterDefinitie)
Try
Dim Definitie As String = Nothing
Dim DefinitieBegin As New Integer
Dim DefinitieEinde As New Integer
Dim Elementen() As String = {}
Dim NieuweParameter As QueryParameterDefinitie = Nothing
Dim OnverwerkteCode As String = Nothing
Static Parameters As New List(Of QueryParameterDefinitie)
If Invoer IsNot Nothing Then
If Parameters.Count > 0 Then
NieuweParameter = Parameters(ParameterIndex)
NieuweParameter.Invoer = Invoer
Parameters.RemoveAt(ParameterIndex)
Parameters.Insert(ParameterIndex, NieuweParameter)
End If
ElseIf QueryCode IsNot Nothing Then
Parameters.Clear()
OnverwerkteCode = QueryCode
Do
DefinitieBegin = OnverwerkteCode.IndexOf(DEFINITIE_TEKENS)
If DefinitieBegin >= 0 Then
DefinitieEinde = OnverwerkteCode.IndexOf(DEFINITIE_TEKENS, DefinitieBegin + DEFINITIE_TEKENS.Length)
If DefinitieEinde >= 0 Then
Definitie = OnverwerkteCode.Substring(DefinitieBegin + DEFINITIE_TEKENS.Length, (DefinitieEinde - DefinitieBegin) - DEFINITIE_TEKENS.Length)
OnverwerkteCode = OnverwerkteCode.Substring(DefinitieEinde + DEFINITIE_TEKENS.Length)
NieuweParameter = New QueryParameterDefinitie With {.Commentaar = "", .Invoer = "", .Lengte = 0, .LengteIsVariabel = False, .Masker = "", .ParameterNaam = "", .Positie = 0, .StandaardWaarde = "", .VeldIsZichtbaar = False}
With NieuweParameter
.Lengte = DEFINITIE_TEKENS.Length + Definitie.Length + DEFINITIE_TEKENS.Length
.Positie = DefinitieBegin