在 Access 2010 中存储字节 []

Posted

技术标签:

【中文标题】在 Access 2010 中存储字节 []【英文标题】:Store Byte[] in Access 2010 【发布时间】:2010-08-03 16:08:47 【问题描述】:

这么简单的任务:如何在 Access 2010 中存储一个字节[]?(整天在网上搜索这个。)

我必须在 access 2010 中使用“附件字段”,因为据我所知,没有其他可能的(varBinary、Image、..)字段可用。

我试过了:(ConvertImageToByte 返回一个 Byte[])

 Cmd.CommandText = "UPDATE Clubs SET Field1 = @File WHERE Name = @Name";
 OleDbParameter para = new OleDbParameter("@File", OleDbType.VarBinary);
 para.Value = ConvertImageToByte(Logo);
 Cmd.ExecuteNonQuery();

例外:“UPDATE 或 DELETE 查询不能包含多值字段。”

我试过了:

 DBEngine dbe = new DBEngine();
 Database db = dbe.OpenDatabase("database.accdb", false, false, "");
 String Command = "SELECT * FROM Clubs";
 Recordset rs = db.OpenRecordset(Command, RecordsetTypeEnum.dbOpenDynaset, 0, LockTypeEnum.dbOptimistic);
 rs.MoveFirst();
 rs.Edit();
 Recordset2 rs2 = (Recordset2)rs.Fields["Field1"].Value;
 rs2.AddNew();

 Field2 f2 = (Field2)rs2.Fields["FileData"];


 f2.LoadFromFile("file.png");
 rs2._30_Update();
 rs2.Close();

 rs._30_Update();
 rs.Close();

这可行,但文件始终位于表格的第一行,我无法弄清楚如何获得正确的行。如果我尝试在 SELECT 语句中添加 WHERE 子句,则会得到“参数太少。预期为 2”。例外。

如果有人知道如何将我的 Byte[](或图像)写入数据库并再次取出,请告诉我!

请不要给我链接:

http://office.microsoft.com/en-us/access-help/using-multivalued-fields-in-queries-HA010149297.aspx#BM4.6

http://www.mikesdotnetting.com/Article/123/Storing-Files-and-Images-in-Access-with-ASP.NET

http://www.sitepoint.com/forums/showthread.php?t=666928

http://www.eggheadcafe.com/software/aspnet/35103540/multivalued-fields-in-access-2007-with-c-ado.aspx

Programmatically managing Microsoft Access Attachment-typed field with .NET

感谢你们的帮助。

【问题讨论】:

如果一切都失败了,您可以随时自己编码数据并将其存储为字符串。您可以将字节解析为十六进制,将它们定界以进行存储,然后将它们传递给一个方法以在检索时取消定界。这将是一个非常老套、臃肿的解决方案,但它会起作用。再三考虑,不要这样做。 =) 感谢 JonH,但有几个原因让我只有一个包含所有信息的文件,例如只需将这个文件发送给其他人。 喜欢你的评论,乔治!想过,但正如你所说 - 不会这样做。 我不会低估乔治的评论。使用备注字段并将其视为 BLOB。在 VBA 中,您可以使用 GetChunk 和 WriteChunk 来处理数据,据我所知,这是在 Jet/ACE 文件中存储二进制数据的推荐方法。我不知道,因为我避免了这个问题并将数据存储在文件系统中。上次我这样做时我后悔了(c. 1998)。 如果你想邮寄一个文件,你可以.zip db和任何其他依赖文件一起 【参考方案1】:

您可以使用 OLE 对象字段,它是 varbinary(max) 匹配的最佳选择。

一些注意事项:

''Reference: Microsoft ActiveX Data Object x.x Library
Dim strSQL As String
Dim strCN As String
Dim rs As dao.Recordset
Dim mstream As ADODB.Stream


strSQL = "SELECT Pix FROM Table1"
Set rs = CurrentDb.OpenRecordset(strSQL)

Set mstream = New ADODB.Stream
mstream.Type = adTypeBinary
mstream.Open
mstream.LoadFromFile "c:\docs\project.jpg" ''FileName & FullPath

rs.AddNew
rs.Fields("Pix").Value = mstream.Read
rs.Update

rs.Close

编辑

要复制回磁盘,您可以再次使用 Stream:

Dim strSQL As String
Dim cn As New ADODB.Connection
Dim mstream As New ADODB.Stream


strSQL = "SELECT Pix FROM Table1"
Set rs = CurrentDb.OpenRecordset(strSQL)

mstream.Type = adTypeBinary
mstream.Open
mstream.Write rs!Pix
mstream.SaveToFile "c:\docs\pixout.jpg", adSaveCreateOverWrite

【讨论】:

OLE 字段有一个包装器,该包装器对于每种 OLE 服务器都是任意的,因此很难将数据拉回。我建议不要使用它们。 几乎所有我发现的用于存储二进制数据的引用都提到了 OLE 对象类型。 Val Mazur (MVP) 指向一个提到 OLE 对象类型的链接,Microsoft 本身也建议使用这种类型。 所有引用都指向它并不意味着它是最好的方法。 Jet/ACE OLE 字段被设计为通过 Access UI 进行操作,并且对这样做的编程支持非常非常差。如果文件是混合类型的(例如,Word 文档和 Excel 电子表格,甚至多个版本的 Word 也可能会出现问题,因为 OLE 包装器不同),则从其中提取数据尤其困难。去过那里,做过,不会再做。

以上是关于在 Access 2010 中存储字节 []的主要内容,如果未能解决你的问题,请参考以下文章

在 VB.NET 中使用 OleDb.NET 调用 Access 2010 存储选择查询的异常

如何从 Access 2010 中的 SQL 存储过程返回多个记录集

getaccesstoken方法

我可以在没有服务器的情况下在 access 2010 中创建存储过程吗? [复制]

我可以在 MS Access 2010 中创建存储过程吗?

使用AHK关闭Access应用程序时未设置对象变量(错误91)