Хранить байт [] в Access 2010 - PullRequest
       2

Хранить байт [] в Access 2010

2 голосов
/ 03 августа 2010

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

Мне нужно использовать «Поле вложений» в Access 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();

Исключение: "запрос 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();

Это работает, но файл все время находится в первом ряду таблицы, и я не могу понять, как получить правильный ряд. Если я попытаюсь добавить предложение 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

Программное управление типизированным полем Microsoft Access с помощью .NET

Спасибо за вашу помощь, ребята.

1 Ответ

1 голос
/ 03 августа 2010

Вы можете использовать поле 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

Чтобы скопировать обратно на диск, вы снова можете использовать 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...