Home > Enterprise >  Saving multiple images as buffers/memory streams to the same table at the same time
Saving multiple images as buffers/memory streams to the same table at the same time

Time:04-05

I'm relatively new to coding and entirely self taught, so please have patience with me.
I've been scouring the internet for an answer to this, but everything I've found is either waaaaaaayyy too technical and looks like ancient greek, or doesn't even apply to my situation.

I'm developing an app for work for my managers to record employee information. The page I'm currently working on is for injuries, however this will apply to multiple pages if I can figure it out. I know I'm probably over-complicating something and it's going to be a stupid answer but I've tried everything I can think of so far.

What I'm trying to do is capture handwritten notes as images and then save them to a database for us in the office to type up and translate if needed. (a lot of my managers don't type) but this would apply to collecting multiple signatures as well i.e. on write ups.

I've got the images saved, but when it comes time to write them to the database, the first image will write just fine, but the second one I start getting the "Data type mismatch in the criteria expression" error.

I've tried isolating the 2nd and third images to see if it's a syntax issue, but I still get the error. I've rebuilt the database table to make sure the destination field is an OLE object, same error. I've been searching for a few days now for the answer and I'm not finding it, so if someone can please help.

I know it's going to be something silly like not disposing of something in the right place, but that is beyond my current knowledge. Thank you in advance for any help.

`Private Sub AddState(pathD As String, PathC As String, PathS As String)   
 'Determination
    ' EXIT IF IMAGE NOT SELECTED
    If String.IsNullOrEmpty(pathD) Then Exit Sub

    'GET IMAGE DATA VIA MEMORY STREAM
    Dim imgD As Image = Image.FromFile(pathD)
    Dim msD As New MemoryStream()
    imgD.Save(msD, imgD.RawFormat)
    Dim bufferD As Byte() = msD.GetBuffer

    'Comments 
    ' EXIT IF IMAGE NOT SELECTED
    If String.IsNullOrEmpty(PathC) Then Exit Sub

    'GET IMAGE DATA VIA MEMORY STREAM
    Dim imgC As Image = Image.FromFile(PathC)
    Dim msC As New MemoryStream()
    imgC.Save(msC, imgC.RawFormat)
    Dim bufferC As Byte() = msC.GetBuffer

    'Supervisor Signature
    ' EXIT IF IMAGE NOT SELECTED
    If String.IsNullOrEmpty(PathS) Then Exit Sub

    'GET IMAGE DATA VIA MEMORY STREAM
    Dim imgS As Image = Image.FromFile(PathS)
    Dim msS As New MemoryStream()
    imgS.Save(msS, imgS.RawFormat)
    Dim bufferS As Byte() = msS.GetBuffer

    access.AddParam("@AccID", lblAccID.Text)
    access.AddParam("@EmpName", lblEmpName.Text)
    access.AddParam("@DOA", lblInjDate.Text)
    access.AddParam("@DOR", Today)
    access.AddParam("@Boss", cbxSupName.Text)
    access.AddParam("@Phone", txtPhone.Text)
    access.AddParam("@RepDate", dpRepDate.Value.Date)
    access.AddParam("@RepTime", txtRepTime.Text & " " & Time)
    access.AddParam("@DrUs", DrUs)
    access.AddParam("@DrThem", DrThem)
    access.AddParam("@Facility", cbxFacility.SelectedItem)
    access.AddParam("@Missed", Missed)
    access.AddParam("@DetType", txtDetermine.Text)
    access.AddParam("@DetFile", lblDetFileLoc.Text)
    access.AddParam("@CommentType", txtComments.Text)
    access.AddParam("@CommFile", lblComFileLoc.Text)
    access.AddParam("@SigFile", lblSigFileLoc.Text)
    access.AddParam("@DetWrite", bufferD)
    access.AddParam("@CommentWrite", bufferC)
    access.AddParam("@SupSig", bufferS)


    access.ExecQuery("INSERT INTO AccSup(AccID, InjEmp, InjDate, RepDate, Supervisor, SupPhone, DateReported, " &
                     "TimeReported, DrUs, DrThem, Facility, MissedWork, SupDetermination, DetFileLoc, " &
                     "SupComments,CommFileLoc, SigFileLoc, Determination, Comment, Sig)" &
                     "VALUES (@AccID, @EmpName, @DOA, @DOR, @Boss, @Phone, @RepDate, " &
                     "@RepTime, @DrUs, @DrThem, @Facility, @Missed, @DetType, @DetFile, " &
                     "@CommentType, @CommFile, @SigFile, @DetWrite, @CommentWrite, @SupSig) ")

    ' REPORT ERRORS
    If Not String.IsNullOrEmpty(access.exception) Then MsgBox(access.exception)

    MsgBox("Report Added")
End Sub

Private Sub cmdSubmit_Click(sender As Object, e As EventArgs) Handles cmdSubmit.Click
    AddState(lblDetFileLoc.Text, lblComFileLoc.Text, lblSigFileLoc.Text)
End Sub`

dbcontrol

Public Class dbControlBU
    'CREATE YOUR DB CONNECTION
    Private DBCon As New OleDbConnection("Provider=Microsoft.ACE.OLEDB.12.0;" &
                                         "Data Source=C:\Users\Public\Documents\Open Enrollment\OpenEnrollment.accdb;Persist Security Info=True;Jet OLEDB:Database Password=****")

    ' PREPARE DB COMMAND
    Private DBCmd As OleDbCommand

    'DB DATA
    Public DBDA As OleDbDataAdapter
    Public DBDT As DataTable

    ' QUERY PARAMETERS
    Public Params As New List(Of OleDbParameter)

    ' QUERY STATISTICS
    Public RecordCount As Integer
    Public exception As String

    Public Sub ExecQuery(Query As String)
        ' RESET QUERY STATS
        RecordCount = 0
        exception = ""

        Try
            ' OPEN A CONNECTION
            DBCon.Open()

            ' CREATE DB COMMAND
            DBCmd = New OleDbCommand(Query, DBCon)

            ' LOAD PARAMS INTO DB COMMAND
            Params.ForEach(Sub(p) DBCmd.Parameters.Add(p))

            ' CLEAR PARAMS LIST
            Params.Clear()

            ' EXECUTE COMMAND AND FILL DATATABLE
            DBDT = New DataTable
            DBDA = New OleDbDataAdapter(DBCmd)
            RecordCount = DBDA.Fill(DBDT)

        Catch ex As Exception
            exception = ex.Message
        End Try

        'CLOSE YOUR CONNECTION
        If DBCon.State = ConnectionState.Open Then DBCon.Close()
    End Sub

    'INCLUDE QUERY & COMMAND PARAMETERS
    Public Sub AddParam(Name As String, Value As Object)
        Dim NewParam As New OleDbParameter(Name, Value)
        Params.Add(NewParam)
    End Sub

    'Schema Restrictions
    ' https://msdn.microsoft.com/en-us/library/cc716722(v=vs.100).aspx

    Public Function GetTables() As List(Of String)
        Dim lstTables As New List(Of String)
        Dim restrictions As String() = New String() {Nothing, Nothing, Nothing, "TABLE"}

        Try
            DBCon.Open()
            DBDT = DBCon.GetSchema("Tables", restrictions)

            For Each r As DataRow In DBDT.Rows
                lstTables.Add(r("TABLE_NAME"))
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If DBCon.State = ConnectionState.Open Then DBCon.Close()
        End Try

        Return lstTables
    End Function

    Public Function GetColumnsByTable(TableName As String) As List(Of String)
        Dim lstColumns As New List(Of String)
        Dim restrictions As String() = New String() {Nothing, Nothing, TableName, Nothing}

        Try
            DBCon.Open()
            DBDT = DBCon.GetSchema("Columns", restrictions)

            For Each r As DataRow In DBDT.Rows
                lstColumns.Add(r("COLUMN_NAME"))
            Next
        Catch ex As Exception
            MsgBox(ex.Message)
        Finally
            If DBCon.State = ConnectionState.Open Then DBCon.Close()
        End Try

        Return lstColumns
    End Function

The error I'm getting is enter image description here

It happens after I go through my app and his "Submit" and it runs the Insert Into statement into the Access Database. I have rebuilt the columns in Access to make sure they're the right datatype and I hadn't accidentally changed something somewhere. That didn't help. The 1st image will save, but 2nd and 3rd images get this error. I've tried not including the 1st image. completely deleted it from the Insert into statement, I figured if I did that, then Image 2 would save, but not 3. no- both of them still didn't save. Got the same error. I tried removing both images 1 and 2 to see if just image 2 was problematic. Same error. At that point the computer almost went out the window.

Here is the error I got after removing the Catch Statement.

System.Data.OleDb.OleDbException HResult=0x80040E07 Message=Data type mismatch in criteria expression. Source=System.Data
StackTrace: at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior) at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior) at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable) at EmployeeManager_New.dbControl.ExecQuery(String Query) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\dbControl.vb:line 42 at EmployeeManager_New.SupStat.AddState(String pathD, String PathC, String PathS) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 639
at EmployeeManager_New.SupStat.cmdSubmit_Click(Object sender, EventArgs e) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 653
at System.Windows.Forms.Control.OnClick(EventArgs e) at System.Windows.Forms.Button.OnClick(EventArgs e) at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent) at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks) at System.Windows.Forms.Control.WndProc(Message& m) at System.Windows.Forms.ButtonBase.WndProc(Message& m) at System.Windows.Forms.Button.WndProc(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m) at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m) at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam) at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData) at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context) at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context) at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel() at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine) at EmployeeManager_New.My.MyApplication.Main(String[] Args) in :line 83

This exception was originally thrown at this call stack: [External Code] EmployeeManager_New.dbControl.ExecQuery(String) in dbControl.vb EmployeeManager_New.SupStat.AddState(String, String, String) in SupStat.vb EmployeeManager_New.SupStat.cmdSubmit_Click(Object, System.EventArgs) in SupStat.vb [External Code]

Newest error code

  at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at EmployeeManager_New.dbControl.ExecQuery(String Query) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\dbControl.vb:line 40
   at EmployeeManager_New.SupStat.AddState(String pathD, String PathC, String PathS) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 631
   at EmployeeManager_New.SupStat.cmdSubmit_Click(Object sender, EventArgs e) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 648
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at EmployeeManager_New.My.MyApplication.Main(String[] Args) in :line 83

And still getting the same "Data Criteria Mismatch" error. I'm gonna start banging my head on my desk.

  at System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult)
   at System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method)
   at System.Data.OleDb.OleDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.OleDb.OleDbCommand.System.Data.IDbCommand.ExecuteReader(CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.FillInternal(DataSet dataset, DataTable[] datatables, Int32 startRecord, Int32 maxRecords, String srcTable, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable[] dataTables, Int32 startRecord, Int32 maxRecords, IDbCommand command, CommandBehavior behavior)
   at System.Data.Common.DbDataAdapter.Fill(DataTable dataTable)
   at EmployeeManager_New.dbControl.ExecQuery(String Query) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\dbControl.vb:line 40
   at EmployeeManager_New.SupStat.AddState(String pathD, String PathC, String PathS) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 631
   at EmployeeManager_New.SupStat.cmdSubmit_Click(Object sender, EventArgs e) in C:\Users\CatWisian\Lone Star Calf Ranch\Lone Star Calf Ranch Site - Documents (1)\General\Cat Apps\Employee Manager-New\EmployeeManager_New\English\Injury\SupStat.vb:line 648
   at System.Windows.Forms.Control.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnClick(EventArgs e)
   at System.Windows.Forms.Button.OnMouseUp(MouseEventArgs mevent)
   at System.Windows.Forms.Control.WmMouseUp(Message& m, MouseButtons button, Int32 clicks)
   at System.Windows.Forms.Control.WndProc(Message& m)
   at System.Windows.Forms.ButtonBase.WndProc(Message& m)
   at System.Windows.Forms.Button.WndProc(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)
   at System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message& m)
   at System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr hWnd, Int32 msg, IntPtr wparam, IntPtr lparam)
   at System.Windows.Forms.UnsafeNativeMethods.DispatchMessageW(MSG& msg)
   at System.Windows.Forms.Application.ComponentManager.System.Windows.Forms.UnsafeNativeMethods.IMsoComponentManager.FPushMessageLoop(IntPtr dwComponentID, Int32 reason, Int32 pvLoopData)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoopInner(Int32 reason, ApplicationContext context)
   at System.Windows.Forms.Application.ThreadContext.RunMessageLoop(Int32 reason, ApplicationContext context)
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.OnRun()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.DoApplicationModel()
   at Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.Run(String[] commandLine)
   at EmployeeManager_New.My.MyApplication.Main(String[] Args) in :line 83

Here's what I have in Access. Maybe someone can see if the problem's there. I don't think it should be though. I've rebuilt this table already to make sure it had the data types I wanted in case I had fat fingered something.

enter image description here

I did test the entire thing before I started with the images as I knew I was venturing into new territory with them, and everything worked ok at that time, so I can safely say it's the images causing the issue.
It may be an access thing. I tend to dream big on these things and then have to get brought back down to reality when I find out Access isn't capable of doing what I wanted it to do. Sql is not an option in this case as the guys are in a barn with a spotty internet connection as it is, so I have to keep things as local as possible.

CodePudding user response:

Some entities use "unmanaged resources" which need to be explicitly taken care of by calling Dispose() on them. There is a way to have that happen automatically for you: the Using statement.

As it happens, both database connections (e.g. OleDbConnection) and the Image type are such entities.

Here is an example of how you could modify your code:

Private Sub AddState(pathD As String, PathC As String, PathS As String)
    ' EXIT EARLY IF IMAGE NOT SELECTED
    If String.IsNullOrEmpty(pathD) OrElse
       String.IsNullOrEmpty(PathC) OrElse
       String.IsNullOrEmpty(PathS) Then

        Exit Sub

    End If

    Dim bufferD As Byte()
    Dim bufferC As Byte()
    Dim bufferS As Byte()

    'GET IMAGE DATA VIA MEMORY STREAM
    Using imgD As Image = Image.FromFile(pathD),
          imgC As Image = Image.FromFile(PathC),
          imgS As Image = Image.FromFile(PathS)

        'Determination
        Dim msD As New MemoryStream()
        imgD.Save(msD, imgD.RawFormat)
        bufferD = msD.GetBuffer()

        'Comments 
        Dim msC As New MemoryStream()
        imgC.Save(msC, imgC.RawFormat)
        bufferC = msC.GetBuffer()

        'Supervisor Signature
        Dim msS As New MemoryStream()
        imgS.Save(msS, imgS.RawFormat)
        bufferS = msS.GetBuffer()

    End Using

    Dim access As New DbControlBu()

    'TODO: Fill in the OleDbType for every parameter
    access.AddParam("@AccID", OleDbType.VarChar, lblAccID.Text)
    access.AddParam("@EmpName", OleDbType.VarChar, lblEmpName.Text)
    access.AddParam("@DOA", lblInjDate.Text)
    access.AddParam("@DOR", OleDbType.Date, Today)
    access.AddParam("@Boss", cbxSupName.Text)
    access.AddParam("@Phone", txtPhone.Text)
    access.AddParam("@RepDate", dpRepDate.Value.Date)
    access.AddParam("@RepTime", txtRepTime.Text & " " & Time)
    access.AddParam("@DrUs", DrUs)
    access.AddParam("@DrThem", DrThem)
    access.AddParam("@Facility", cbxFacility.SelectedItem)
    access.AddParam("@Missed", Missed)
    access.AddParam("@DetType", txtDetermine.Text)
    access.AddParam("@DetFile", lblDetFileLoc.Text)
    access.AddParam("@CommentType", txtComments.Text)
    access.AddParam("@CommFile", lblComFileLoc.Text)
    access.AddParam("@SigFile", lblSigFileLoc.Text)
    access.AddParam("@DetWrite", OleDbType.LongVarBinary, bufferD)
    access.AddParam("@CommentWrite", OleDbType.LongVarBinary, bufferC)
    access.AddParam("@SupSig", OleDbType.LongVarBinary, bufferS)


    access.ExecQuery("INSERT INTO AccSup(AccID, InjEmp, InjDate, RepDate, Supervisor, SupPhone, DateReported, " &
                 "TimeReported, DrUs, DrThem, Facility, MissedWork, SupDetermination, DetFileLoc, " &
                 "SupComments,CommFileLoc, SigFileLoc, Determination, Comment, Sig)" &
                 "VALUES (@AccID, @EmpName, @DOA, @DOR, @Boss, @Phone, @RepDate, " &
                 "@RepTime, @DrUs, @DrThem, @Facility, @Missed, @DetType, @DetFile, " &
                 "@CommentType, @CommFile, @SigFile, @DetWrite, @CommentWrite, @SupSig) ")

    ' REPORT STATUS
    If String.IsNullOrEmpty(access.exception) Then
        MsgBox("Report Added")
    Else
        MsgBox(access.exception)
    End If

End Sub

dbcontrol

Imports System.Data.OleDb

Public Class DbControlBu
    ' DB CONNECTION STRING
    Private Const connStr As String = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=""C:\Users\Public\Documents\Open Enrollment\OpenEnrollment.accdb"";Persist Security Info=True;Jet OLEDB:Database Password=****"

    'DB DATA
    Public DBDA As OleDbDataAdapter
    Public DBDT As DataTable

    ' QUERY PARAMETERS
    Public Params As New List(Of OleDbParameter)

    ' QUERY STATISTICS
    Public recordCount As Integer
    Public exception As String

    Public Sub ExecQuery(query As String)
        ' RESET QUERY STATS
        recordCount = 0
        exception = ""

        Try
            Using conn As New OleDbConnection(connStr),
                   cmd As New OleDbCommand(query, conn)
                ' OPEN A CONNECTION
                conn.Open()

                ' LOAD PARAMS INTO DB COMMAND
                Params.ForEach(Sub(p) cmd.Parameters.Add(p))

                ' CLEAR PARAMS LIST
                Params.Clear()

                ' EXECUTE COMMAND AND FILL DATATABLE
                DBDT = New DataTable()
                DBDA = New OleDbDataAdapter(cmd)
                recordCount = DBDA.Fill(DBDT)

            End Using

        Catch ex As Exception
            exception = ex.Message
        End Try

    End Sub

    'INCLUDE QUERY & COMMAND PARAMETERS
    Public Sub AddParam(name As String, dbType As OleDbType, value As Object)
        Dim newParam As New OleDbParameter() With {.ParameterName = name, .OleDbType = dbType, .Value = value}
        Params.Add(NewParam)
    End Sub

    Public Sub AddParam(Name As String, Value As Object)
        Dim NewParam As New OleDbParameter(Name, Value)
        Params.Add(NewParam)
    End Sub

    'Schema Restrictions
    ' https://msdn.microsoft.com/en-us/library/cc716722(v=vs.100).aspx

    Public Function GetTables() As List(Of String)
        Dim lstTables As New List(Of String)
        Dim restrictions As String() = New String() {Nothing, Nothing, Nothing, "TABLE"}

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()
                DBDT = conn.GetSchema("Tables", restrictions)

                For Each r As DataRow In DBDT.Rows
                    lstTables.Add(r("TABLE_NAME").ToString()) ' Add .ToString()
                Next
            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Return lstTables

    End Function

    Public Function GetColumnsByTable(tableName As String) As List(Of String)
        Dim lstColumns As New List(Of String)
        Dim restrictions As String() = New String() {Nothing, Nothing, tableName, Nothing}

        Try
            Using conn As New OleDbConnection(connStr)
                conn.Open()
                DBDT = conn.GetSchema("Columns", restrictions)

                For Each r As DataRow In DBDT.Rows
                    lstColumns.Add(r("COLUMN_NAME").ToString()) ' Add .ToString()
                Next

            End Using

        Catch ex As Exception
            MsgBox(ex.Message)
        End Try

        Return lstColumns

    End Function

End Class

I can't test it, but hopefully it gives you enough information to fix your code.

(Although a MemoryStream has a Dispose method, it is the one case where you don't need to call that.)

  • Related