2012-03-27 4 views
5

Visual Basic 6에서 생성 한 레거시 데이터베이스 파일에서 데이터를 읽어야합니다. 레거시 소프트웨어에서 Put 및 Put 함수에 매개 변수로 레코드 정렬을 전달합니다.C#으로 VB6 레코드 파일 (Put으로 쓰는)을 읽음

Type THE_TYPE 
    FIELD_1 As Single 
    FIELD_2 As String * 20 
    FIELD_3(1 To 50) As Single 
    FIELD_4(1 To 10) As String * 1 
End Type 

내 유형이 더 크고 더 복잡하지만 난 내 프로젝트에 THE_TYPE에 내가 가지고있는 서로 다른 정의를 넣어했습니다이 구조들은 아래와 같이 정의된다. Microsoft.VisualBasic 가져 오기를 사용하면 파일을 작성하는 데 사용 된 VB 함수와 유사한 VB 함수에 액세스 할 수 있으므로 FileSystem.OpenFile() 및 .CloseFile(); 지금은 마지막으로 포함 된 데이터를 읽을 필요가 원래의 기능 때문에이었다

Public RecordContent As THE_TYPE 
[...] 
Get #1, recordNumber, RecordContent 

은 내가() Microsoft.VisualBasic.FileSystem.FileGet 같은 비슷한 사용할 수 있습니다 가정합니다. 질문 : 그렇다면 컨테이너를 정의하는 방법은 무엇입니까? 원래 VB6 유형 "THE_TYPE"과 비슷한 클래스를 사용하고 있습니까? .FileGet()을 호출하여이 객체를 올바르게 채우려면 어떻게해야합니까?

+0

GSerg가 올바른 방향으로 지적했을 수도 있지만 '임의'와 '이진'의 '열기'모드간에 'Put'방식이 큰 차이가 있음을 알아 두십시오. http://msdn.microsoft.com/en-us/library/aa266212(v=VS.60).aspx 및 http://msdn.microsoft.com/en-us/library/aa266177(v=vs. 60) .aspx를 참조하십시오. 'String'과 배열 멤버가 모두 고정 된 크기라면 VB6 앱이 Open ... Binary 모드를 사용했는지 궁금 해서요. – rskar

+0

랜덤 모드였습니다 – ccalboni

+1

+1'Microsoft.VisualBasic'을 가져오고'FileSystem'을 사용합니다. 당신은 놀랄거야 [방법] (http://stackoverflow.com/questions/7290976/vb6-how-are-binary-files-encoded-using-put-statement) [자주] (http://stackoverflow.com/questions/8886096/converting-quick-basic-to-vb-net-random-access-files) 사람들은 그것들을 간과합니다! – MarkJ

답변

6

키가 VB.NET의 구조체 선언에 적절하게 속성을 정의하고 있습니다. 구조체가 항상 FileGet에 의해 초기화되면 컨스트럭터에서 고정 필드를 수동으로 초기화 할 필요가 없습니다. 그렇지 않으면 생성자에서 고정 필드를 초기화 할 필요가 없습니다.

Structure THE_TYPE 
    Public FIELD_1 As Single 
    <VBFixedString(20), System.Runtime.InteropServices.MarshalAs(System.Runtime.InteropServices.UnmanagedType.ByValArray, SizeConst:=20)> Public FIELD_2 As String 
    <VBFixedArray(49)> Public FIELD_3 As Single() 
    <VBFixedArray(9)> Public FIELD_4 As Char() 
End Structure 

Obviosuly 배열은 0부터 시작해야하므로 위쪽 경계가 아래로 이동합니다.

파일에서 읽기 :

Dim d As System.ValueType = New THE_TYPE() 

FileOpen(1, "...", OpenMode.Random, OpenAccess.Read, OpenShare.Default, 234) 
FileGet(1, d, 1) 
FileClose(1) 

234가 VB6에서 구조의 크기입니다. 그것은 VB.NET에서 더 크기 때문에 하드 코딩을 원합니다.

+0

바로 그게 내가 찾고있는 것입니다. 고마워요! – ccalboni

+0

+1. 필자는 이것을 테스트하지 않았고 하드 코딩이 가장 안전 할 수 있지만 Marshal.Sizeof가 올바른 구조체 크기를 반환할까요? – MarkJ

+0

@ MarkJ 아니요,이 경우에는 'Len'과 같은 244가 반환됩니다. 이는 'Char'가 .net의 2 바이트이기 때문일 수 있습니다. – GSerg