2010-08-03 3 views
2

간단한 작업 : Access 2010에 Byte []를 저장하는 방법은 무엇입니까? (하루 종일 웹 검색)Access 2010에 Byte [] 저장

가능한 한 다른 가능한 (varBinary, Image, ..) 필드가 없기 때문에 액세스 2010에서 "첨부 필드"를 사용해야합니다. .

내가 시도 :

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

예외 (ConvertImageToByte가 바이트 [] 반환) : ". 업데이 트를 또는 다중 값 필드를 포함 할 수 없습니다 쿼리를 삭제"

내가 시도 :

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의 첫 번째 행의 모든 ​​시간과 내가 올바른 행을 얻는 방법을 파악 할수 없어. 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

0,123,977,131,292,388,362,165,252 :

줘하지는주십시오에 대한 링크

도움 주셔서 감사합니다.

+0

실패를 그것을 문자열로 저장하십시오. 바이트를 16 진수로 구문 분석하고 저장 영역을 구분 한 다음 메소드에 전달하여 retreval을 사용하지 않을 수 있습니다. 그것은 매우 해킹되고, 부풀어 오른 해결책이 될 것이지만 작동 할 것입니다. 두 번째 생각에서 이것을하지 마십시오. =) –

+0

감사합니다. JonH. 그러나 모든 정보가 포함 된 파일이 하나 뿐인 데는 몇 가지 이유가 있습니다. 하나는이 하나의 파일을 다른 사람들에게 보내야합니다. – Gpx

+0

당신의 코멘트를 사랑하십시오 George! 그것에 대해 생각해 보았지만 말했듯이 그렇게하지 않을 것입니다. – Gpx

답변

1

OLE 개체 필드를 사용할 수 있으며 varbinary (최대) 일치를위한 최선의 선택입니다.

일부 노트 :

''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 

편집

다시 디스크에 복사하려면, 당신은 다시 스트림 사용할 수 있습니다 : 당신은 항상 데이터를 직접 인코딩 할 수 있습니다, 만약 모든 사람이

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 객체 유형을 언급합니다. Val Mazur (MVP)는 OLE 개체 유형을 언급하는 링크를 가리키며 Microsoft 자체도이 유형을 제안합니다. – Fionnuala