Declare array of size[1]Edit

Dim a As String() = New String(4) {}

Write to log (textbox on form) with autoscrollEdit

'writes a line to a TB that should be setup to have a monospace font like courier new
Sub WriteToLog(t As String)                         'takes argument for string
    LogTB.AppendText(t & vbCrLf)                    'writes a line of text and a CR to the LogTB
End Sub

'writes lines to a TB that should be setup to have a monospace font like courier new
Sub WriteSeparatorToLog(t As String, s As Integer)  'takes argument for string and int for separator
    Dim logll As Integer = 72                       'set the line length
    Dim sep As String = "-"                         'default separator
    Select Case s                                   '}
        Case 0                                      '}
            sep = "-"                               '}
        Case 1                                      '}
            sep = "="                               '} set the separator
        Case 2                                      '}
            sep = "#"                               '}
        Case 3                                      '}
            sep = "*"                               '}
    End Select                                      '}
    If t.Length > 0 Then                            'if text is supplied then create the log line
        Dim tot As Integer = t.Length               'calculate total characters
        Dim es = Math.Floor((logll - tot) / 2)      'calculate half line length
        For i = 0 To es - 1                         '}
            LogTB.AppendText(sep)                   '} write separator characters
        Next                                        '}
        LogTB.AppendText(" " & t & " ")             'write the text
        For i = 0 To (logll - es - t.Length)        '}
            LogTB.AppendText(sep)                   '} write the other separator characters
        Next                                        '}
        LogTB.AppendText(vbCrLf)                    'insert line break
    Else                                            'if no text is supplied then create a line only
        For i = 0 To (logll + 2)                    '}
            LogTB.AppendText(sep)                   '} write the separator line with no text
        Next                                        '}
        LogTB.AppendText(vbCrLf)                    'insert line break
    End If
End Sub

'autoscrolls the log window
Private Sub LogTB_TextChanged_1(sender As Object, e As EventArgs) Handles LogTB.TextChanged
    LogTB.SuspendLayout()                           'stop updates
    LogTB.SelectionStart = LogTB.TextLength         'select text
    LogTB.ScrollToCaret()                           'position the scrollbar at the end of selection
    LogTB.ResumeLayout()                            'start updates again
End Sub

Place a textbox called LogTB on the form.

Collections vs Dictionaries[2]Edit

Feature                 | COLLECTION | DICTIONARY | Remark
------------------------+------------+------------+--------------------------------
Usually faster          |            |     X      | 
------------------------+------------+------------+--------------------------------
Supported by VB Script  |            |     X      | Collections do not exist in VBS.
------------------------+------------+------------+--------------------------------
                        |            |            | Dicts: Add ref to Miscrosoft 
Native to VBA           |     X      |            | Scripting Library. Usage:
                        |            |            | Dim MyDict As Scripting.Dictionary
                        |            |            | Set MyDict = New Scripting.Dictionary
------------------------+------------+------------+--------------------------------
Can change Keys and     |            |            | Dict properties are writable.
Items                   |            |     X      | For collections, remove the item
                        |            |            | and add a new item.
------------------------+------------+------------+--------------------------------
                        |            |            | A collection enumerates its items:
                        |            |            |  For Each x In MyCollection
                        |            |            |      Debug.Print x
Enumerated              |     X      |     X      |  Next x
                        |            |            | A dict enumerates its keys:
                        |            |            |  For Each x In MyDictionary
                        |            |            |      Debug.Print MyDictionary.Item(x)
                        |            |            |  Next x
------------------------+------------+------------+--------------------------------
                        |            |            | A 1-d array of keys 
Directly output to      |            |            | and items can be returned by 
array                   |            |     X      | dict methods .Keys and .Items.
                        |            |            | (The array is zero-based even 
                        |            |            |  with Option Base 1.)
------------------------+------------+------------+--------------------------------
Retrieve and access     |     X      |     X      |
items                   |            |            |  
------------------------+------------+------------+--------------------------------
Add items               |     X      |     X      |
------------------------+------------+------------+--------------------------------
Implicitly add items    |            |     X      | Dicts can implicitly add items 
                        |            |            | using .Item property.
------------------------+------------+------------+--------------------------------
Remove items            |     X      |     X      |
------------------------+------------+------------+--------------------------------
Remove all items in     |            |            | With collections, each item must
one step                |            |     X      | be removed in turn, or the 
                        |            |            | collection destroyed and recreated.
------------------------+------------+------------+--------------------------------
Count items             |     X      |     X      |
------------------------+------------+------------+--------------------------------
Return item using key   |     X      |     X      |
as lookup value         |            |            |
------------------------+------------+------------+--------------------------------
Return item using       |            |            |
ordinal position        |     X      |   (Slow)   |
as lookup value         |            |            |
------------------------+------------+------------+--------------------------------
Return ordinal          |            |            |
position using item     |     X      |     ??     |
as lookup value         |            |            |
------------------------+------------+------------+--------------------------------
Retrieve and access     |            |     X      | Collection keys only used to
keys                    |            |            | look up data, not retrievable.
------------------------+------------+------------+--------------------------------
Keys optional           |     X      |            | Big + of collections, assuming keys
                        |            |            | are not needed. (Access via index.)
------------------------+------------+------------+--------------------------------
Case sensitivity        |            |     X      |
optional                |            |            |  
------------------------+------------+------------+--------------------------------
                        |            |            | Collection keys must be strings.
Keys can be any type    |            |     X      | Dict keys can have any type
                        |            |            | (except arrays), incl. mixed types.
------------------------+------------+------------+--------------------------------
Keys must be unique     |     X      |     X      |
------------------------+------------+------------+--------------------------------
                        |            |            | * For collections, add code:
                        |            |            |  Public Function _
                        |            |            |     Contains(col As Collection, _
Supports .Exists method |  Remark*   |     X      |     key As Variant) As Boolean
                        |            |            |     On Error Resume Next
                        |            |            |     col(key)
                        |            |            |     Contains = (Err.Number = 0)
------------------------+------------+------------+--------------------------------
Preserve key order when |            |     X      | This is because collection keys 
sorting by item value   |            |            | are write-only, not read. Poor design!

Regex MatchEdit

Public Sub Main()
    Dim pattern As String = "\ba\w*\b"
    Dim input As String = "An extraordinary day dawns with each new day."
    Dim m As Match = Regex.Match(input, pattern, RegexOptions.IgnoreCase)
    If m.Success Then
        Console.WriteLine("Found '{0}' at position {1}.", m.Value, m.Index)
    End If
End Sub

Regex CalculatorEdit

https://regex101.com/

Generic error handling with error detailsEdit

Try
    'try this code for size....
Catch ex As Exception
    MessageBox.Show(ex.Message) 'show the specific error
End Try

Search pdf for textEdit

(based on[3])Edit
'function to searh a pdf for a string. returns a list of integers that are page numbers of the found string
Public Shared Function GetTextFromPDF(ByVal PdfFileName As String, searchPhrase As String) As List(Of Integer)
    Dim fpage As New List(Of Integer)
    Try
        Dim oReader As New iTextSharp.text.pdf.PdfReader(PdfFileName)
        Dim sOut = ""
        For i = 1 To oReader.NumberOfPages
            Dim its As New iTextSharp.text.pdf.parser.SimpleTextExtractionStrategy
            sOut = iTextSharp.text.pdf.parser.PdfTextExtractor.GetTextFromPage(oReader, i, its)
            Dim adrRx As Regex = New Regex(searchPhrase)
            For Each item As Match In adrRx.Matches(sOut)
                fpage.Add(i)
            Next
        Next
    Catch ex As Exception
        MessageBox.Show(ex.Message)
    End Try
    Dim ddup As List(Of Integer)
    ddup = fpage.Distinct().ToList
    Return ddup
End Function

Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
    Dim ret As List(Of Integer) = GetTextFromPDF("C:\Users\david.lowe\Documents\NXOpen_Getting_Started.pdf", "drawings")
    If ret.Count > 0 Then
        Dim t = ""
        For j = 0 To ret.Count - 1
            t &= ret(j).ToString & vbCrLf
        Next
        MsgBox("found the term on pages" & vbCrLf & t)
    Else
        MsgBox("nothing found")
    End If
End Sub

Webview2 (updated internal webbrowser)Edit

Instructions to setup[4]

End of textbox edit (lostfocus)Edit

Use lostfocus event[5]

Get appdata writable locationEdit

Imports System.Environment
Imports System.IO

ReadOnly appData As String = GetFolderPath(SpecialFolder.ApplicationData)
ReadOnly savefile As String = appData & "\" & "nxsearchlist.txt"

Check if a file existsEdit

If File.Exists(filepath) Then
    'execute if exists code
Else
    'execute if does not exist
End If

Read a text file to a textboxEdit

Sub Readin(mems As Stream)
    dxfTB.Visible = False : dxfTB.Enabled = False
    Using r As New StreamReader(mems)
        dxfTB.Text = r.ReadToEnd
    End Using
    dxfTB.Visible = True : dxfTB.Enabled = True
End Sub

Write a text file from a textboxEdit

'save file function
Sub WriteOut()
    File.WriteAllText(savefile, sourcesListTB.Text)
End Sub

Regions to enclose code blocks[6]Edit

#Region "RegionName"
    'Code in region goes here.
#End Region

Object type routines[7]Edit

'function that takes any object and returns the object type
Function WhatObject(ByVal Obj As Object)
    Return Obj.GetType()
End Function

'function that takes any object and returns true if it is a string
Function IsObjectAString(ByVal Obj As Object)
    If Obj.GetType() Is GetType(String) Then
        Return True
    Else
        Return False
    End If
End Function

'function that takes any object and returns true if it is a double
Function IsObjectADouble(ByVal Obj As Object)
    If Obj.GetType() Is GetType(Double) Then
        Return True
    Else
        Return False
    End If
End Function

Exit an application[8]Edit

Application.Exit()

Open file dialog exampleEdit

With path and filename parsing from the selected file.

Dim inputfile, outputpath, outputfilename
OpenFileDialog1.Filter = "Text files | *.txt"
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
    inputfile = OpenFileDialog1.FileNames(0)
    outputfilename = Path.GetFileNameWithoutExtension(inputfile)
    outputpath = Path.GetDirectoryName(inputfile)
    MessageBox.Show("The path is " & outputpath & vbCrLf & "The filename will begin with " & outputfilename)
End If

Get files in directory recursivelyEdit

Dim FileNames = IO.Directory.GetFiles("c:\path", "*.*", IO.SearchOption.AllDirectories)

Get files in a directory (no recursion)Edit

Dim FileNames() As String = IO.Directory.GetFiles("c:\path")

Parsing filenames and paths[9]Edit

Dim filename = Path.GetFileNameWithoutExtension(file) 'get the filename part only from the complete path
Dim extension = Path.GetExtension(file) 'get the file extension part only from the complete path

Send an emailEdit

 'create the mail message
 Dim mail As New MailMessage()
 
 'set the addresses
 mail.From = New MailAddress("xx@xx")
 mail.[To].Add("xx@xx")
 
 'set the content
 mail.Subject = "This is an email"
 mail.Body = "this is a sample body"
 
 'set the server
 Dim smtp As New SmtpClient("localhost")
 
 'send the message
 Try
     smtp.Send(mail)
     Response.Write("Your Email has been sent sucessfully - Thank You")
 Catch exc As Exception
     Response.Write("Send failure: " & exc.ToString())
 End Try

Timer exampleEdit

Define the clock interval with
 Timer1.Interval = 213
 Timer1.Start()
The tick block is executed each interval
     Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
         'sendCommand("<nowiki>http://192.168.1.201:9001/</nowiki>", "On15")
         Button10.PerformClick()
     End Sub

Timer example (one shot)Edit

'start timer in whatever method...
Timer1.Start()

'Timer to handle tick event
Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Timer1.Stop()
    '...do one shot operations here
End Sub

Random number exampleEdit

 ' Initialize the random-number generator.
 Randomize()
 ' Generate random value between 1 and 6.
 Dim value As Integer = CInt(Int((6 * Rnd()) + 1))

Proper random function that correctly deals with .next and seedingEdit

'Handy random number genertion function with .next / proper seeding support
Public Function GetRandom(ByVal Min As Integer, ByVal Max As Integer) As Integer
    Static Generator As System.Random = New System.Random()
    Return Generator.Next(Min, Max)
End Function

Can also be used to select more than one file and thus returns an array of filenames:Edit

OpenFileDialog1.Filter = "TEXT FILE | *.txt |PDF FILE |.pdf |ALL FILES |*.*"
If OpenFileDialog1.ShowDialog = DialogResult.OK Then
	For x = 0 To OpenFileDialog1.FileNames.Count - 1
		MsgBox(OpenFileDialog1.FileNames(x))
	Next
End If

Must set multiple select to true in the property explorer

Background workerEdit

  'Load page data into datatable button
     Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
         BackgroundWorker1.RunWorkerAsync()
     End Sub
 
     'Load page data into datatable sub
     Private Sub BackgroundWorker1_DoWork(ByVal sender As System.Object, ByVal e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
         Dim counter As String = ""
         Dim i = 0
         Do While i < 50000
             Try
                 counter = System.IO.File.ReadLines("c:\temp\output.txt")(i)
                 Dim R As DataRow = dt.NewRow
                 R("Title") = Split(counter, vbTab)(0)
                 R("Timestamp") = Split(counter, vbTab)(1)
                 R("SHA1") = Split(counter, vbTab)(2)
                 dt.Rows.Add(R)
                 i = i + 1
             Catch
                 Exit Do
             End Try
         Loop
         DataGridView1.Invoke(Sub() redrawdgv())
     End Sub

Background worker and argument passing and progress update (preferred)Edit

Place a progressBar, button and label on a form

Option Strict On
Option Explicit On
Imports System.ComponentModel

Public Class Form1
    '˅˅˅˅˅˅˅˅ MAIN THREAD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    'trigger the bgw. this is the entry point in the main code from where you initiate the bgw things
    Private Sub Button1_Click_1(sender As Object, e As EventArgs) Handles Button1.Click
        BackgroundWorker1.RunWorkerAsync()                                  '<-- do the call in yout main code using this line like this
        'other stuff can be called here while the bgw is running
    End Sub

    'this is a helper sub to coordinate the various handlers for progress etc. the actual worker is called from here with arguments for the bgw if necessary
    Private Sub BackgroundWorker1_DoWork_1(sender As Object, e As DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        BGWprocess(BackgroundWorker1, "Some string", "Some other string")   'two (or none or many) arguments may be passed to the bgw
    End Sub

    'update main ui thread with progress updates
    Private Sub BackgroundWorker1_ProgressChanged(sender As Object, e As ProgressChangedEventArgs) Handles BackgroundWorker1.ProgressChanged
        ProgressBar1.Visible = True
        ProgressBar1.Value = e.ProgressPercentage                           'two parameters may be passed from the worker.reportprogress method: .ProgressPercentage - which is a built-in variable
        Label1.Text = e.UserState.ToString                                  'and also a .UserState parameter (optional) which can be whatever you define it as (in this case a string)
        If ProgressBar1.Value = 100 Then
            ProgressBar1.Visible = False
        End If
    End Sub
    '˄˄˄˄˄˄ MAIN THREAD ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

    '˅˅˅˅˅˅ OTHER THREAD ###################################################################################################################################################
    'this is the bgw worker thread sub. the calling arguments from dowork are received here ie: MsgBox(Var1 & Var2)
    Sub BGWprocess(worker As System.ComponentModel.BackgroundWorker, Var1 As String, Var2 As String)
        worker.WorkerReportsProgress = True                                 'it is False by default
        For i = 1 To 100                                                    '}
            Threading.Thread.Sleep(10)                                      '} this is the background work stuff where you do useful work
            worker.ReportProgress(i, i.ToString())                          '} <-- this line sends the two progress arguments that .ProgressChanged (above) is able to utilise
        Next i                                                              '}
    End Sub
    '˄˄˄˄˄˄ OTHER THREAD ###################################################################################################################################################
End Class

Read file buffer of file size length or max size 1GB*Edit

*Note that if the file is larger, only 1GB will be read into the buffer with this method. It is quick and dirty. The max size can be altered to suit the application. There is some maximum but it is unknown.

 Private Function GetMemStreamFromFile_BestEverFunctionName(ByVal FilePath As String) As IO.MemoryStream
         Dim stFile As IO.Stream = IO.File.Open(FilePath, IO.FileMode.Open)
         Dim bs
         Try
             bs = CInt(stFile.Length)
         Catch
             bs = 1000000000
         End Try
         Dim stMem As IO.MemoryStream = New IO.MemoryStream
         Dim buffer(bs) As Byte
         stFile.Read(buffer, 0, buffer.Length)
         stMem.Write(buffer, 0, buffer.Length)
         stFile.Close()
         stMem.Seek(0, IO.SeekOrigin.Begin)
         Return stMem
     End Function

Date and TimeEdit

Dim StartTime As DateTime = #6/12/2008 3:09:00 PM#    
Dim EndTime As DateTime = #6/10/2008 12:04:00 PM# 
Dim TimeDiff As TimeSpan = EndTime.Subtract(StartTime)  
Dim Days As Integer = TimeDiff.ToatlDays    'calculate Value of Days Component    
Dim Minutes As Integer = TimeDiff.TotalMinutes  'calculate Value of Minutes Component      
Dim Seconds As Integer = TimeDiff.TotalSeconds  'calculate Value of Seconds Component       
Dim TotalDays As Integer = TimeDiff.TotalDays  'calculate Value of Total Days     
Dim TotalHours As Integer = TimeDiff.TotalHours  'calculate Value of Total Minutes     
Dim TotalSeconds As Integer = TimeDiff.TotalSeconds  'calculate Value of Total Seconds

Count the number of linesEdit

Dim lineCount = File.ReadAllLines(inputfile).Length

Database tutorialEdit

Microsoft docs[10]

SQLiteEdit

Imports System.Data.SQLite
Imports System.Text

Public Class Form1
    Dim sqlite_mem As SQLiteConnection
    Dim dataSources As String
    Dim createString = "CREATE TABLE IF NOT EXISTS test (ip1 INTEGER, ip2 INTEGER, ip3 INTEGER, ip4 INTEGER, text varchar(24));"
    Dim diskContents

    Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
        'run sub to create the memory DB instance
        memDBConnect()
        'create and execute the command to create the memory DB table
        Dim sqlite_cmd = sqlite_mem.CreateCommand()
        sqlite_cmd.CommandText = createString
        sqlite_cmd.ExecuteNonQuery()

    End Sub

    'create the memory DB instance
    Sub memDBConnect()
        Dim memDBsource = "Data Source=:memory:;Version=3;"
        sqlite_mem = New SQLiteConnection(memDBsource)
        sqlite_mem.Open()
    End Sub

    'destroy the memory DB instance
    Sub memDBDisconnect()
        Try
            If sqlite_mem IsNot Nothing Then sqlite_mem.Close()
        Catch ex As Exception
        End Try
    End Sub

    Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
        Dim sqlite_cmd = sqlite_mem.CreateCommand()
        ' Let the SQLiteCommand object know our SQL-Query:
        Dim id = TextBox1.Text
        sqlite_cmd.CommandText = "INSERT INTO test (ip1, ip2, ip3, ip4, text) VALUES (81, 174, 250, 136, 'FFFFFFFFFFFFFFFFFFFFFFFF');"
        Try
            sqlite_cmd.ExecuteNonQuery()
        Catch
            MsgBox("Nope")
        End Try
    End Sub

    Private Sub Button3_Click(sender As Object, e As EventArgs) Handles Button3.Click
        OutputTextBox.Enabled = False
        OutputTextBox.Visible = False
        Dim sqlite_cmd = sqlite_mem.CreateCommand()
        Dim sqlite_datareader As SQLiteDataReader
        sqlite_cmd.CommandText = "SELECT * FROM test"
        sqlite_datareader = sqlite_cmd.ExecuteReader()
        OutputTextBox.Clear()
        ' The SQLiteDataReader allows us to run through each row per loop
        While (sqlite_datareader.Read()) ' Read() returns true if there is still a result line to read
            Dim ip1, ip2, ip3, ip4 As Object
            Dim textReader As String
            ip1 = sqlite_datareader.GetValue(0)
            ip2 = sqlite_datareader.GetValue(1)
            ip3 = sqlite_datareader.GetValue(2)
            ip4 = sqlite_datareader.GetValue(3)
            textReader = sqlite_datareader.GetString(4)
            OutputTextBox.AppendText(ip1 & "." & ip2 & "." & ip3 & "." & ip4 & " " & textReader & vbCrLf)
        End While
        OutputTextBox.Enabled = True
        OutputTextBox.Visible = True
    End Sub

    Private Sub Button4_Click(sender As Object, e As EventArgs) Handles Button4.Click
        BackgroundWorker1.RunWorkerAsync()
    End Sub

    Function ipToBinString(ipString)
        Dim ipBin
        Dim splitToOctets = Split(ipString, ".")
        For Each octet In splitToOctets
            Dim hexString = Hex(CInt(octet)).PadLeft(2, "0")
            Dim i As Integer = Convert.ToInt32(hexString, 16)
            Dim s2 As String = Convert.ToString(i, 2).PadLeft(8, "0")
            ipBin = ipBin & s2
        Next
        Return ipBin
    End Function

    Function ipToInt(ipString)
        Dim ipBin
        Dim splitToOctets = Split(ipString, ".")
        For Each octet In splitToOctets
            Dim hexString = Hex(CInt(octet)).PadLeft(2, "0")
            Dim i As Integer = Convert.ToInt32(hexString, 16)
            Dim s2 As String = Convert.ToString(i, 2).PadLeft(8, "0")
            ipBin = ipBin & s2
        Next
        Return ipBin
    End Function

    Private Sub BackgroundWorker1_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles BackgroundWorker1.DoWork
        Dim sqlite_cmd = sqlite_mem.CreateCommand()
        Dim t As New stringFunctions
        ' Let the SQLiteCommand object know our SQL-Query:
        For i = 0 To 1024
            Dim ip1, ip2, ip3, ip4 As Integer
            ip1 = Math.Round((Rnd() * 255))
            ip2 = Math.Round((Rnd() * 255))
            ip3 = Math.Round((Rnd() * 255))
            ip4 = Math.Round((Rnd() * 255))
            Dim u = t.genRndStr(24)
            sqlite_cmd.CommandText = "INSERT INTO test (ip1, ip2, ip3, ip4, text) VALUES (" & ip1 & "," & ip2 & "," & ip3 & "," & ip4 & ", '" & u & "');"
            sqlite_cmd.ExecuteNonQuery()
        Next
        MsgBox("Done")
    End Sub

    'dump the database in memory to disk
    Dim sqlite_disk
    Dim memContents
    Sub dumpMemToDisk()
        'get all the rows from the memory database
        Dim sqlite_cmd2 = sqlite_mem.CreateCommand()
        sqlite_cmd2.CommandText = "SELECT * FROM test;"
        memContents = sqlite_cmd2.ExecuteReader()
        writeToDiskBGW.RunWorkerAsync() ' do the write to disk from memContents in a BGW thread
    End Sub

    'do the actual writing as a backgroundworker
    Private Sub writeToDiskBGW_DoWork(sender As Object, e As System.ComponentModel.DoWorkEventArgs) Handles writeToDiskBGW.DoWork
        'Create the disk database
        Dim safePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
        Dim dataSource = "Data Source=" & safePath & "\limbo.sqlite;Version=3;Cache Size=1048000;"
        sqlite_disk = New SQLiteConnection(dataSource)
        sqlite_disk.Open()

        'drop the memory table then create
        Dim sqlite_cmdx = sqlite_disk.CreateCommand()
        ' Let the SQLiteCommand object know our SQL-Query:
        sqlite_cmdx.CommandText = "DROP TABLE IF EXISTS test;"
        ' Now lets execute the SQL ;-)
        sqlite_cmdx.ExecuteNonQuery()



        'create the table on the disk copy
        Dim sqlite_cmd = sqlite_disk.CreateCommand()
        sqlite_cmd.CommandText = createString
        sqlite_cmd.ExecuteNonQuery()
        While (memContents.Read())
            Dim ip1, ip2, ip3, ip4 As Object
            Dim textReader As String
            ip1 = memContents.GetValue(0)
            ip2 = memContents.GetValue(1)
            ip3 = memContents.GetValue(2)
            ip4 = memContents.GetValue(3)
            textReader = memContents.GetString(4)
            Dim sqlite_disk_write = sqlite_disk.CreateCommand()
            sqlite_disk_write.CommandText = "INSERT INTO test (ip1, ip2, ip3, ip4, text) VALUES (" & ip1 & "," & ip2 & "," & ip3 & "," & ip4 & ",'" & textReader & "');"
            sqlite_disk_write.ExecuteNonQuery()
        End While
        memContents.close()
        sqlite_disk.Close()
        System.Data.SQLite.SQLiteConnection.ClearAllPools()
        GC.Collect()
    End Sub

    'dump the database on disk to memory
    Sub dumpDiskToMem()
        memDBDisconnect() 'shut mem db if already open
        memDBConnect() 'recreates the mem db to receive disk version
        'Create the disk database
        Dim safePath = Environment.GetFolderPath(Environment.SpecialFolder.UserProfile)
        Dim dataSource = "Data Source=" & safePath & "\limbo.sqlite;Version=3;Cache Size=1048000;"
        sqlite_disk = New SQLiteConnection(dataSource)
        sqlite_disk.Open()
        'create table
        Dim sqlite_cmd = sqlite_mem.CreateCommand()
        sqlite_cmd.CommandText = createString
        sqlite_cmd.ExecuteNonQuery()
        'get all the rows from the disk database
        Dim sqlite_cmd2 = sqlite_disk.CreateCommand()
        sqlite_cmd2.CommandText = "SELECT * FROM test;"
        diskContents = sqlite_cmd2.ExecuteReader()


        'drop the memory table then create
        Dim sqlite_cmdx = sqlite_mem.CreateCommand()
        ' Let the SQLiteCommand object know our SQL-Query:
        sqlite_cmdx.CommandText = "DROP TABLE IF EXISTS test;"
        ' Now lets execute the SQL ;-)
        sqlite_cmd.ExecuteNonQuery()
        'create table again
        Dim sqlite_cmdy = sqlite_mem.CreateCommand()
        ' Let the SQLiteCommand object know our SQL-Query:
        sqlite_cmdy.CommandText = createString
        ' Now lets execute the SQL ;-)
        sqlite_cmd.ExecuteNonQuery()


        While (diskContents.Read())
            Dim ip1, ip2, ip3, ip4 As Object
            Dim textReader As String
            ip1 = diskContents.GetValue(0)
            ip2 = diskContents.GetValue(1)
            ip3 = diskContents.GetValue(2)
            ip4 = diskContents.GetValue(3)
            textReader = diskContents.GetString(4)
            Dim sqlite_mem_write = sqlite_mem.CreateCommand()
            sqlite_mem_write.CommandText = "INSERT INTO test (ip1, ip2, ip3, ip4, text) VALUES (" & ip1 & "," & ip2 & "," & ip3 & "," & ip4 & ",'" & textReader & "');"
            sqlite_mem_write.ExecuteNonQuery()
        End While
        sqlite_disk.Close()
        System.Data.SQLite.SQLiteConnection.ClearAllPools()
        GC.Collect()
        GC.WaitForPendingFinalizers()
    End Sub

    Private Sub Button5_Click(sender As Object, e As EventArgs) Handles Button5.Click
        dumpMemToDisk()
    End Sub

    Private Sub Button6_Click(sender As Object, e As EventArgs) Handles Button6.Click
        dumpDiskToMem()
    End Sub
End Class

Class stringFunctions
    Dim legalCharacters As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ1234567890"
    Dim random As New Random()

    Function genRndStr(size As Integer)
        Dim builder As New StringBuilder()
        Dim ch As Char

        For i = 0 To size - 1
            ch = legalCharacters(random.Next(0, legalCharacters.Length))
            builder.Append(ch)
        Next

        Return builder.ToString()
    End Function
End Class

ReferencesEdit