2010-08-03 2 views
2

Такая простая задача: Как сохранить байт [] в Access 2010? (Поиск в Интернете в течение всего дня.)Байт магазина [] в Access 2010

Я должен использовать «поле вложения» в доступе 2010, потому что, насколько я могу видеть, нет другого возможного поля (varBinary, Image, ..) ,

Я попробовал: (ConvertImageToByte возвращает байт [])

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

Исключение: "An 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(); 

Это работает, но файл находится в первой строке Tabel все время, и я не могу понять, как получить нужную строку. Если я попытаюсь добавить предложение WHERE к оператору SELECT, то получите «Слишком мало параметров. Ожидаемое 2.» исключение.

Если кто-нибудь знает путь к рассказу моего байта [] (или изображение) в базу данных, вытащите его снова, пожалуйста, дайте мне знать!

Пожалуйста, не дайте мне ссылки на:

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

Спасибо за помощь.

+0

Если все остальное терпит неудачу, вы всегда можете кодировать данные самостоятельно и сохраните его как строку. Вы можете проанализировать свои байты в Hex, разграничить их для хранения, а затем передать их методу, чтобы исключить их избыточность retreval. Это было бы очень взломанное, раздутое решение, но это сработало бы. С другой стороны, не делайте этого. =) –

+0

Спасибо JonH, но есть несколько причин для меня иметь только один файл со всей информацией, так, например, нужно отправить этот единственный файл другим людям. – Gpx

+0

Любите свой комментарий Джордж! Мысль об этом, но, как вы говорите, не сделаете этого. – Gpx

ответ

1

Вы можете использовать поле OLE Object, это лучший выбор для сочетания 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 

EDIT

Для копирования на диск, вы можете снова использовать поток:

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 
+0

Спасибо Remou, я попробую это на работе завтра. – Gpx

+0

OLE-поля имеют оболочку, которая является произвольной для каждого типа OLE-сервера и затрудняет извлечение данных. Я бы рекомендовал не использовать их. –

+0

Довольно почти все ссылки, которые я нашел для хранения двоичных данных, упоминают тип объекта OLE. Вал Мазур (MVP) указывает на ссылку, в которой упоминается тип объекта OLE, и сама Microsoft также предлагает этот тип. – Fionnuala