2010-01-25 14 views
5

का उपयोग कर हम ग # का उपयोग कर और BinaryFormatter.We बाइट सरणी में बदल जाएंगे और VARBINARY प्रकार का उपयोग कर एक डेटाबेस में दुकान स्ट्रिंग मान तो हम डेटाबेसConvert बाइट सरणी TransactSQL

public static byte[] ToBytes(stringvalue) 
{ 
    if (value == null) 
    return null; 

    byte[] inMemoryBytes; 
    using (MemoryStream inMemoryData = new MemoryStream()) 
    { 
    new BinaryFormatter().Serialize(inMemoryData, value); 
    inMemoryBytes = inMemoryData.ToArray(); 
    } 

    return inMemoryBytes; 
} 

ठीक करने के लिए बचाने के लिए कर रहे हैं, तो अगर हम बचाने के char "a", हम डेटाबेस में "0x0001000000FFFFFFFF0100000000000000060100000001610B" देख सकते हैं। इसके बाद हम डेटा पुनर्प्राप्त कर सकते हैं और फिर स्ट्रिंग में कनवर्ट कर सकते हैं।
क्या हम इस बाइनरी मान ("0x0001000000FFFFFFFF0100000000000000060100000001610B") को चार ("ए") में केवल ट्रांसएक्ट एसक्यूएल का उपयोग करके परिवर्तित कर सकते हैं (इसलिए हम संशोधन, आवेषण, एसक्यूएल सर्वर कंसोल से तुलना कर सकते हैं)?

बहुत बहुत धन्यवाद। नहीं कर सकते

create table #sample (content varbinary(max)); 
insert into #sample values (0x61) 
select cast(content as varchar) from #sample 

उत्तर

2

तुम कुछ सरल उपयोग करने के लिए कर सकते थे,

रूप
Encoding.Default.GetBytes("a"); 

कि वापस आ जाएगी "61" और अधिक आसानी से एक varchar में अनुवाद किया जा सकता है, सिर्फ इस चल आप बस मूल स्ट्रिंग को nvarchar(MAX) प्रकार कॉलम में संग्रहीत करते हैं? आप varbinary प्रकार स्तंभ का उपयोग करने के लिए, तो कम से कम System.Text.Encoding कक्षाओं का उपयोग रूपांतरण करने के लिए है - तो आप के रूप में अच्छी एसक्यूएल में तार को डिकोड कर सकते हैं:

public static byte[] ToBytes(string value) 
{ 
    if (value == null) return null; 
    return System.Text.Encoding.Unicode.GetBytes(value); 
} 

और फिर इस तरह इसका इस्तेमाल:

select cast(VarBinaryField as nvarchar(max)) from SomeTable 
+0

धन्यवाद रूबन्स, लेकिन इस तकनीक का उपयोग अन्य ढांचे (एंटीलिब कंट्रीब http://entlibcontrib.codeplex.com/) के लिए किया जाता है और इसे बदल नहीं सकता है। वे इसका उपयोग करते हैं क्योंकि तब थाई अधिक प्रकारों को स्टोर कर सकता है: इनट्स, स्ट्रिंग, इमेज इत्यादि आदि और हम चाहते हैं (केवल तभी जब स्ट्रिंग स्ट्रिंग हो) इस संग्रहीत मानों को स्ट्रिंग – Oscar

+0

ऑस्कर में परिवर्तित करें, क्या 'बिटकॉन्टर.गेटबाइट्स' उपयोगी हो सकता है? –

+0

लेकिन यह नेट फ्रेमवर्क से एक तरीका है, है ना? मैं केवल SqlConsole का उपयोग करना चाहता हूँ। मैं क्लेनक्स के अनुसार, सीएलआर एसक्यूएल कार्यों का उपयोग कर प्रोग्रामिंग कर रहा हूं। फिर से धन्यवाद। – Oscar

0

क्यों:

+0

धन्यवाद पेंट, लेकिन इस tecnique का उपयोग अन्य ढांचे (Entlib Contrib http://entlibcontrib.codeplex.com/) के लिए किया जाता है और इसे बदल नहीं सकता है। वे इसका उपयोग करते हैं क्योंकि तब थाई अधिक प्रकारों को स्टोर कर सकता है: इनट्स, स्ट्रिंग, इमेज इत्यादि आदि और हम चाहते हैं (केवल तभी जब स्ट्रिंग स्ट्रिंग हो) इस संग्रहीत मानों को स्ट्रिंग – Oscar

+0

में कनवर्ट करें, फिर आप क्लेनक्स द्वारा सुझाए गए सीएलआर उपयोगकर्ता परिभाषित कार्यों का उपयोग कर सकते हैं। –

2

मैं .NET regex लाइब्रेरी का उपयोग करने के लिए http://msdn.microsoft.com/en-us/magazine/cc163473.aspx वर्णित विधि का उपयोग करने का सुझाव दूंगा। विशेष रूप से सीएलआर उपयोगकर्ता परिभाषित कार्यों के लिए अनुभाग। आप अपने बाइट सरणी को deserialize करने के लिए बस बाइनरीफॉर्मेटर का उपयोग कर सकते हैं।

[SqlFunction] 
public static string ToStringFromBytes(byte[] value) 
{ if (value == null) return null; 

    using (MemoryStream inMemoryData = new MemoryStream(value)) 
    { 
    return new BinaryFormatter().Deserialize(inMemoryData) as string; 
    } 
} 
+0

आप कठोर हैं, मुझे इसके बारे में याद नहीं आया ... मैं देखने जा रहा हूं। धन्यवाद !! – Oscar