【发布时间】:2016-12-26 06:29:06
【问题描述】:
我已经为此苦苦琢磨了好几个小时,但还没有做好,所以我决定发帖。
我的 Vb.NET 应用程序在硬盘上有 2 张 Jpg。一个是LowRes,另一个是HighRes。我想通过INSERT 将两张图片保存在Microsoft Access 2007 数据库中的同一记录中,这工作正常,然后UPDATE 添加第二张。 UPDATE 不起作用。
我拼凑了一堆我在网上找到的INSERT 代码(边走边学),最终找到了一些真正有效的方法。然而,尝试调整函数以执行更新以添加第二张图片被证明是困难的。我怀疑这与我指定参数错误有关?
数据库有 1 个表 Records 和 3 列 RecordID(这是文本,以及从 Form1.Tb_RecordID.Text 提取的自动编号主键)、HighRes(这是 OLE)和 LowRes(其中也是 OLE)。该数据库名为Database.accdb。
我调用子程序:
Save_To_Database("LowProfile.jpg", "LowRes")
如果我想要INSERT "LowRes" 列中的 OLE 图像。然后我打电话给
Update_To_Database("HighProfile.jpg", "HighRes")
用HighRes 图片更新记录。我最终希望一对一地整合这些函数,并使用 ByVals 来确定它是应该更新还是插入。
这很好用:
Sub Save_To_Database(ByVal Filename As String, ByVal Res As String)
Dim cnString As String = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=Database.accdb"
Dim theQuery As String = "INSERT INTO Records([RecordID],[" & Res & "]) values (" & Form1.Tb_RecordID.Text & ", @Img)"
Try
Dim fs As FileStream
fs = New FileStream(Filename, FileMode.Open, FileAccess.Read)
Dim picByte As Byte() = New Byte(fs.Length - 1) {}
fs.Read(picByte, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
Dim CN As New OleDbConnection(cnString)
CN.Open()
Dim imgParam As New OleDbParameter()
imgParam.OleDbType = OleDbType.Binary
imgParam.ParameterName = "Img"
imgParam.Value = picByte
Dim cmd As New OleDbCommand(theQuery, CN)
cmd.Parameters.Add(imgParam)
cmd.ExecuteNonQuery()
MessageBox.Show("Image successfully saved.")
cmd.Dispose()
CN.Close()
CN.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
但是,我的UPDATE 代码失败,SQL 语句出现语法错误:
Sub Update_To_Database(ByVal Filename As String, ByVal Res As String)
Dim cnString As String = "PROVIDER=Microsoft.ACE.OLEDB.12.0;Data Source=Database.accdb"
Dim theQuery As String = "UPDATE Records SET ([" & Res & "]) values (@Img) WHERE RecordID =" & Form1.Tb_RecordID.Text
MsgBox(theQuery)
Try
Dim fs As FileStream
fs = New FileStream(Filename, FileMode.Open, FileAccess.Read)
Dim picByte As Byte() = New Byte(fs.Length - 1) {}
fs.Read(picByte, 0, System.Convert.ToInt32(fs.Length))
fs.Close()
Dim CN As New OleDbConnection(cnString)
CN.Open()
Dim imgParam As New OleDbParameter()
imgParam.OleDbType = OleDbType.Binary
imgParam.ParameterName = "Img"
imgParam.Value = picByte
Dim cmd As New OleDbCommand(theQuery, CN)
cmd.Parameters.Add(imgParam)
cmd.ExecuteNonQuery()
MessageBox.Show("Image successfully saved.")
cmd.Dispose()
CN.Close()
CN.Dispose()
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
有人看到问题了吗?或者改进代码的方法?
【问题讨论】:
-
使用类似
UPDATE Records SET ([" & Res & "]) = @Img WHERE -
我找到了这个线程:Tinyurl.com/hkjwtwz 并且非常喜欢他如何构建他的 SQL,甚至它如何检查记录是否存在。我试图修改它来做类似的事情,但我不知道如何处理 imgParam 或 fs。
-
还有阿拜。它仍然抛出语法错误。我做了一个 Msgbox 来查看字符串,它说:“UPDATE Records SET ([HighRes]) = @img WHERE RecordID =1”,如果有帮助的话。
-
SQL Injection alert - 您应该不将您的 SQL 语句连接在一起 - 使用 参数化查询 来避免 SQL 注入
-
尝试去掉 [HighRes]: 周围的括号。
UPDATE Records SET [HighRes] = @Img ....