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
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 83This 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.
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.)