실제로이 질문을 올바르게 읽으면 질문하는 질문과는 약간 다른 질문 인 것 같습니다. (1) JET/ACE 데이터베이스에 이진 코드를 포함 할 수 있습니까? 그리고 (2) MS-Access에서 .NET DLL로부터 메소드를 호출 할 수 있습니까?
- 예, 이진 파일을 JET/ACE 데이터베이스에 포함시킬 수 있습니다. 이 작업을 수행하는 기본 방법은 파일을 이진 파일로 읽고 메모 필드에서 base64로 인코딩하는 것입니다.
먼저 이진 파일을 바이트 배열로 읽어야합니다. 이는 Open
을 사용하거나 ADODB.Stream
개체를 사용하여 수행 할 수 있습니다. 그런 다음 바이트 배열을 Base64 문자열로 인코딩하고 마지막으로 해당 문자열을 테이블에 씁니다. 바이너리를 내보내려면 그 반대입니다. 여기 가져 오기 및 사용하여 메모 필드에 이진 파일을 내보내려면 그 Base64로 기능을 사용하는 방법의 예는,
'Requires reference to Microsoft XML v3.0
Private Function EncodeBase64(ByRef arrData() As Byte) As String
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
' help from MSXML
Set objXML = New MSXML2.DOMDocument
' byte array to base64
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.nodeTypedValue = arrData
EncodeBase64 = objNode.Text
' thanks, bye
Set objNode = Nothing
Set objXML = Nothing
End Function
Private Function DecodeBase64(ByVal strData As String) As Byte()
Dim objXML As MSXML2.DOMDocument
Dim objNode As MSXML2.IXMLDOMElement
' help from MSXML
Set objXML = New MSXML2.DOMDocument
Set objNode = objXML.createElement("b64")
objNode.dataType = "bin.base64"
objNode.Text = strData
DecodeBase64 = objNode.nodeTypedValue
' thanks, bye
Set objNode = Nothing
Set objXML = Nothing
End Function
그리고 :
여기 자료 64 (Source)에 바이트 배열을 변환하는 기능입니다 ADODB.Stream
객체 :
Function ImportBinary()
'Requires a reference to ActiveX Data Objects 2.8 or higher
Dim InputStream As ADODB.stream
Dim FileBytes() As Byte
Set InputStream = New ADODB.stream
InputStream.Type = adTypeBinary
InputStream.Open
InputStream.LoadFromFile ("A:\Binary\File\To\Import.dll")
FileBytes = InputStream.Read()
With CurrentDb().TableDefs("TableWithMemoField").OpenRecordset
.AddNew
!MemoField.Value = EncodeBase64(FileBytes)
.Update
.Close
End With
InputStream.Close
End Function
Function ExportBinary()
Dim OutputStream As ADODB.stream
Set OutputStream = New ADODB.stream
OutputStream.Type = adTypeBinary
OutputStream.Open
With CurrentDb().TableDefs("TableWithMemoField").OpenRecordset
OutputStream.Write DecodeBase64(!MemoField.Value)
.Close
End With
OutputStream.SaveToFile "A:\Binary\File\To\Export.dll"
OutputStream.Close
End Function
양자 택일로, 당신은 또한 "첨부 파일"필드가 OLE 필드, 또는 액세스의 최신 버전으로 파일을 포함 할 수있다. 나는 이것을 사용할 수 있다고 믿는다.
- 예, .NET DLL에서 메서드를 호출 할 수 있습니다 (here 참조). 기본적으로 Access에서 .NET 런타임을 호스팅하고 있습니다.
제한 사항은 링크 된 페이지에 4.0을 사용할 수 있다고하지만 실제로는 .NET 2.0 또는 3.5 런타임 만 호스팅 할 수 있다는 것입니다. 내가 아는 한, VBA에서 .NET 4.0+ 런타임을 호스팅하는 쉬운 방법은 없습니다. 4.0+ DLL을 호출하려고하면 "어셈블리가 런타임보다 최신"이라는 효과가 발생합니다.
예, 2.0 및/또는 3.5 런타임이 설치된 시스템에서도 사용해야합니다.
또한 네트워크 공유에서 직접 DLL을로드하지 않습니다. 이것은 (link)을 극복하는 것이 가능한 .NET 프레임 워크의 한계이지만 Access에서 DLL을 호스팅 할 때 수행 할 수 있는지 확실하지 않습니다.
"임베디드"DLL을 사용하려면 사용하기 전에 데이터베이스에서 내 보내야합니다. 좋은 장소는 사용자의 임시 폴더입니다.
EDIT : - 이전에 필자는 C# 클래스를 COM으로 노출 할 필요가 없다고했지만 필자는이 테스트를 거쳐 이것이 올바르지 않다는 것을 알았습니다.VBA에서 클래스를 올바르게 인스턴스화하려면 클래스에 [COMVisible(true)]
속성을 선언하거나 IDispatch 인터페이스를 구현해야합니다. 그렇지 않으면 CreateInstanceFrom
은 Nothing을 반환합니다.
그게 무슨 문제라도 예외적으로 나쁜 해결책 인 것 같습니다. 대신 실제 문제에 대해 물어 보시지 않으시겠습니까? – nvoigt
Access 내부에 단어 또는 .exe 또는 .dll을 저장할 수 있습니다. 따라서 Access 시작시 .dll의 존재 여부를 확실히 확인할 수 있습니다. 발견되지 않으면 Access에서 로컬 테이블을 꺼내어 .dll을 응용 프로그램과 동일한 디렉터리에 저장하십시오. 그러나 이러한 시간까지 언급했다. NET (COM) 파일을 끌어 오기, 그들은 Access에서 사용할 수 없습니다. 그리고 대부분의 경우 이러한 COM 객체를 사용하기 전에 등록해야합니다. 즉, side-by-net 접근 방식을 사용할 수없는 경우 COM 객체를 등록 할 수있는 충분한 권한이 필요합니다. –