2010-02-03 9 views
8

में पैक किए गए रिकॉर्ड के भीतर फिक्स्ड साइज्ड स्ट्रिंग्स के डेल्फी ऐरे को कैसे पढ़ा जाए, मुझे डेटाबेस से एक सी # ऐप में ब्लॉब फ़ील्ड पढ़ने की जरूरत है।सी #

हालांकि ब्लॉब क्षेत्र निम्न विधि का उपयोग कर एक डेल्फी अनुप्रयोग से डेटाबेस के लिए लिखा गया था:

procedure WriteABlob(Blob : TBlobField; var Buffer; size : integer); 
var 
    s : String; 
begin 
    setlength(s,size); 
    move(buffer,s[1],Size); 
    Blob.Value := S; 
end; 

संरचना डेटाबेस के लिए लिखा एक सरल संरचना नहीं है और

MyVariable : Array[0..3] of String[80]; 
तरह बातें शामिल हैं

या इससे भी बदतर उनमें से कुछ

MyRecord = Packed Record 
case byte of 
    1: (
     iValue:Integer; 
     ) 
    2: (
     cValue:Char; 
     ) 
end; 

मैं कोशिश कर रहा हूं डेटाबेस से बाइट में eading और फिर

Marshal.PtrToStructure() 

का उपयोग कर के क्रम में यह struct

मेरे struct के रूप में परिभाषित किया गया है में स्थानांतरित करने के लिए इस प्रकार है:

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1, Size = 10710)] 
    public struct MyBlobField 
    { 
     ... 
     [MarshalAs(UnmanagedType.ByValArray, ArraySubType = UnmanagedType.AnsiBStr,SizeConst = SpecificArraySize)] 
     public String[] ArrayofFixedLengthStrings; 
     ... 
    } 

लेकिन जब बुला मैं कोई त्रुटि मिलती है Marshal.PtrToStructure():

नहीं किया जा सकता मार्शल क्षेत्र प्रकारके 'ArrayofFixedLengthStrings''MyBlobField': अमान्य प्रबंधित/अप्रबंधित प्रकार संयोजन (स्ट्रिंग [] को LPStr, LPWStr, BStr या LPTStr के ArraySubType के साथ जोड़ा जाना चाहिए)।

मैं अगर वहाँ था सोच रहा था एक विशेषता मैं एक CustomMarshaler पर निर्धारित कर सकते हैं जो एक String []

कोई भी विचार कैसे मैं सी # में ब्लॉब की सामग्री को पढ़ सकता है के साथ एक जोड़ी को स्वीकार करेंगे?

+0

डाली जा करने की जरूरत है यह वास्तव में एक AnsiBstr और नहीं एक नियमित रूप से BSTR (अर्थात यूनिकोड) है। यह बहुत गैर मानक है। –

+1

डेल्फी के पुराने संस्करण (डी 2007 समेत) यूनिकोड के बजाए अंसी पर मानकीकृत। –

उत्तर

2

यह पता चल ...

रूप

[StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)] 
    public struct String20 
    { 
     [MarshalAs(UnmanagedType.U1)] 
     public byte StringSize; 
     [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 20)] 
     public String Value; 
    } 

एक struct String20 घोषित जाहिर है एक निश्चित लंबाई स्ट्रिंग की शुरुआत (अर्थात एक डेल्फी ShortString) में स्ट्रिंग आकार पहचानकर्ता केवल 1 बाइट है। तब को header_identifiers की परिभाषा ही बदल:

 [MarshalAs(UnmanagedType.ByValArray, SizeConst = max_header_identifiers)] 
     public String20[] header_identifiers; 

भी पाया गया कि डेल्फी पैक्ड बूलियन के रूप में

[MarshalAs(UnmanagedType.I1)] 
public bool BooleanVar; 
0

मेरी पहली टिप्पणी यह ​​है कि "स्ट्रिंग [80]" एक निश्चित लंबाई वाली स्ट्रिंग है (जिसे संरचना में संभालना आसान होना चाहिए), और सी # में आप इसे "स्ट्रिंग []" में डालने की कोशिश कर रहे हैं - जो वास्तव में एक स्ट्रिंग के लिए एक संदर्भ (सूचक) है।

मेरी अगली टिप्पणी यह ​​है कि आप सबसे बुरी तरह से इसे बाइट्स की एक सरणी में पढ़ने का प्रयास कर सकते हैं, और बाइट्स को खींच सकते हैं और उन्हें गंतव्य संरचना में कुशल बना सकते हैं।

+0

मैं इसे स्ट्रिंग की सरणी में डालने की कोशिश कर रहा था! मेरे अन्य विचार एक पूर्णांक में पढ़ने के साथ-साथ 3 AnsiBStr सामान्य स्ट्रिंग्स में पढ़ने के साथ थे (यानी सरणी को फ़्लैट करें और इसके आकार पैरामीटर को अनदेखा करें)। क्या इसका मतलब यह है कि यदि मैं किसी ऑब्जेक्ट मार्शल इंटरफ़ेस का उपयोग करता हूं और ऑब्जेक्ट के बजाए पॉइंटर वापस करता हूं तो मैं एक ऐरे के लिए कस्टममार्कशेलर का उपयोग कर सकता हूं? मुझे लगता है कि यह एक विशेषता थी। यह हमारे पास ऐसा एकमात्र ब्लॉब नहीं है और यह अकेला 10k है, मैं अभी तक बाइट एरे के मार्ग से नीचे नहीं जाना चाहूंगा। –