将多个图像保存为 buffers/memory 同时流到相同的 table
Saving multiple images as buffers/memory streams to the same table at the same time
我对编码比较陌生,完全是自学的,所以请耐心等待。
我一直在网上搜索这个问题的答案,但我发现的所有内容要么 waaaaaaayyy 太技术化,看起来像古希腊语,要么根本不适合我的情况。
我正在为我的经理开发一个工作应用程序来记录员工信息。我目前正在处理的页面是关于受伤的,但是如果我能弄清楚的话,这将适用于多个页面。我知道我可能把某些事情复杂化了,这将是一个愚蠢的答案,但我已经尝试了到目前为止我能想到的一切。
我想做的是将手写笔记捕捉为图像,然后将它们保存到数据库中,供办公室的我们在需要时输入和翻译。 (我的很多经理都不打字)但这也适用于收集多个签名,即在写 ups 时。
我已经保存了图片,但是当需要将它们写入数据库时,第一张图片会写得很好,但是第二张图片我开始收到“条件表达式中的数据类型不匹配”错误。
我试过将第二张和第三张图片分开看是否是语法问题,但我仍然遇到错误。我重建了数据库 table 以确保目标字段是一个 OLE 对象,同样的错误。我已经搜索了几天的答案,但没有找到,所以如果有人可以提供帮助。
我知道这会很愚蠢,比如没有在正确的地方处理某些东西,但这超出了我目前的知识范围。预先感谢您的帮助。
`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`
数据库控制
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%28v=vs.100%29.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
我得到的错误是
它发生在我通过我的应用程序和他的“提交”并将插入语句运行到 Access 数据库之后。
我已经重建了 Access 中的列以确保它们是正确的数据类型并且我没有不小心更改了某处的内容。那没有帮助。
第一张图片将保存,但第二张和第三张图片出现此错误。我试过不包括第一张图片。从 Insert into 语句中完全删除它,我想如果我这样做,那么图像 2 会保存,但不会保存 3。
不——他们俩还是没救。得到了同样的错误。
我尝试删除图像 1 和 2 以查看是否只有图像 2 有问题。同样的错误。那时电脑几乎没电了 window.
这是删除 Catch 语句后出现的错误。
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]
最新的错误代码
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
并且仍然遇到相同的“数据标准不匹配”错误。我要开始用头敲桌子了。
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
这是我在 Access 中的内容。也许有人可以查看问题是否存在。我认为不应该。我已经重建了这个 table 以确保它具有我想要的数据类型,以防万一我手指粗了。
我确实在开始使用图像之前测试了整个东西,因为我知道我正在和它们一起冒险进入新的领域,当时一切正常,所以我可以肯定地说是图像导致了问题。
这可能是一个访问的事情。我倾向于对这些事情抱有远大的梦想,然后当我发现 Access 不能做我想做的事情时,我不得不回到现实。 Sql 在这种情况下不是一个选择,因为这些家伙在谷仓里,互联网连接不稳定,所以我必须尽可能保持本地化。
一些实体使用“非托管资源”,需要通过调用 Dispose() on them. There is a way to have that happen automatically for you: the Using 语句明确处理。
碰巧,数据库连接(例如 OleDbConnection)和图像类型都是这样的实体。
这是一个如何修改代码的示例:
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
数据库控制
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%28v=vs.100%29.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
我无法对其进行测试,但希望它能为您提供足够的信息来修复您的代码。
(虽然 MemoryStream 有一个 Dispose 方法,但在这种情况下您不需要调用它。)
我对编码比较陌生,完全是自学的,所以请耐心等待。
我一直在网上搜索这个问题的答案,但我发现的所有内容要么 waaaaaaayyy 太技术化,看起来像古希腊语,要么根本不适合我的情况。
我正在为我的经理开发一个工作应用程序来记录员工信息。我目前正在处理的页面是关于受伤的,但是如果我能弄清楚的话,这将适用于多个页面。我知道我可能把某些事情复杂化了,这将是一个愚蠢的答案,但我已经尝试了到目前为止我能想到的一切。
我想做的是将手写笔记捕捉为图像,然后将它们保存到数据库中,供办公室的我们在需要时输入和翻译。 (我的很多经理都不打字)但这也适用于收集多个签名,即在写 ups 时。
我已经保存了图片,但是当需要将它们写入数据库时,第一张图片会写得很好,但是第二张图片我开始收到“条件表达式中的数据类型不匹配”错误。
我试过将第二张和第三张图片分开看是否是语法问题,但我仍然遇到错误。我重建了数据库 table 以确保目标字段是一个 OLE 对象,同样的错误。我已经搜索了几天的答案,但没有找到,所以如果有人可以提供帮助。
我知道这会很愚蠢,比如没有在正确的地方处理某些东西,但这超出了我目前的知识范围。预先感谢您的帮助。
`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`
数据库控制
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%28v=vs.100%29.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
我得到的错误是
它发生在我通过我的应用程序和他的“提交”并将插入语句运行到 Access 数据库之后。 我已经重建了 Access 中的列以确保它们是正确的数据类型并且我没有不小心更改了某处的内容。那没有帮助。 第一张图片将保存,但第二张和第三张图片出现此错误。我试过不包括第一张图片。从 Insert into 语句中完全删除它,我想如果我这样做,那么图像 2 会保存,但不会保存 3。 不——他们俩还是没救。得到了同样的错误。 我尝试删除图像 1 和 2 以查看是否只有图像 2 有问题。同样的错误。那时电脑几乎没电了 window.
这是删除 Catch 语句后出现的错误。
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]
最新的错误代码
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
并且仍然遇到相同的“数据标准不匹配”错误。我要开始用头敲桌子了。
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
这是我在 Access 中的内容。也许有人可以查看问题是否存在。我认为不应该。我已经重建了这个 table 以确保它具有我想要的数据类型,以防万一我手指粗了。
我确实在开始使用图像之前测试了整个东西,因为我知道我正在和它们一起冒险进入新的领域,当时一切正常,所以我可以肯定地说是图像导致了问题。
这可能是一个访问的事情。我倾向于对这些事情抱有远大的梦想,然后当我发现 Access 不能做我想做的事情时,我不得不回到现实。 Sql 在这种情况下不是一个选择,因为这些家伙在谷仓里,互联网连接不稳定,所以我必须尽可能保持本地化。
一些实体使用“非托管资源”,需要通过调用 Dispose() on them. There is a way to have that happen automatically for you: the Using 语句明确处理。
碰巧,数据库连接(例如 OleDbConnection)和图像类型都是这样的实体。
这是一个如何修改代码的示例:
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
数据库控制
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%28v=vs.100%29.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
我无法对其进行测试,但希望它能为您提供足够的信息来修复您的代码。
(虽然 MemoryStream 有一个 Dispose 方法,但在这种情况下您不需要调用它。)