जब आप कोई कस्टम एकीकृत फ़ंक्शन बनाने आप enumeration format निर्दिष्ट करने की जरूरत है:आईबीरीरीरियललाइज इंटरफेस विधियों के लिए क्या उपयोग किया जाता है?
स्वरूप गणन SqlUserDefinedTypeAttribute और SqlUserDefinedAggregateAttribute द्वारा किया जाता है उपयोगकर्ता-निर्धारित प्रकार (UDT) या कुल का क्रमबद्धता प्रारूप इंगित करने के लिए।
और जब UserDefined
प्रारूप प्रयोग किया जाता है, IBinarySerialize Interface को लागू करने और अपने read
और write
तरीकों ओवरराइड करने के लिए अपनी कक्षा की जरूरत है।
मेरा प्रश्न यह है कि इन तरीकों को वास्तव में क्या करना है?
examples पर देखकर, मुझे लगता है कि वे एकत्रीकरण परिणाम पढ़ने/लिखने में सक्षम होना चाहिए?
उदाहरण के लिए, मैं एक एसक्यूएल सीएलआर फ़ंक्शन बनाने की कोशिश कर रहा हूं जो अलग-अलग संख्याओं को जोड़ता है। टी-एसक्यूएल में मेरे पास 1 से 255 विशिष्ट संख्याएं हो सकती हैं (TINYINT मान)। मुझे उनसे एक स्ट्रिंग बनाने की आवश्यकता है (डेलीमीटर का उपयोग करके), लेकिन संख्याओं को भी क्रमबद्ध करना। समारोह काम करने के लिए लगता है, लेकिन मैं वास्तव में यकीन है कि मैं तरीकों को ओवरराइड अपेक्षा के अनुरूप नहीं हूँ:
[Serializable]
[
Microsoft.SqlServer.Server.SqlUserDefinedAggregate
(
Microsoft.SqlServer.Server.Format.UserDefined,
IsInvariantToNulls = true,
IsInvariantToDuplicates = true,
IsInvariantToOrder = false,
MaxByteSize = 1024
)
]
public class ConcatenateAnswersPos : Microsoft.SqlServer.Server.IBinarySerialize
{
private List<byte> intermediateResult;
public void Init()
{
intermediateResult = new List<byte>();
}
public void Accumulate(SqlByte value)
{
intermediateResult.Add((byte)value);
}
public void Merge(ConcatenateAnswersPos other)
{
intermediateResult.AddRange(other.intermediateResult);
}
public SqlString Terminate()
{
if (intermediateResult != null)
{
intermediateResult.Sort();
return new SqlString(string.Join(";", intermediateResult));
}
else
{
return new SqlString("");
}
}
public void Read(BinaryReader r)
{
if (r == null) throw new ArgumentNullException("r");
intermediateResult = new List<byte>();
string[] answers = r.ReadString().Split(';');
foreach (string answer in answers)
{
intermediateResult.Add(Convert.ToByte(answer));
}
}
public void Write(BinaryWriter w)
{
if (w == null) throw new ArgumentNullException("w");
intermediateResult.Sort();
w.Write(string.Join(";", intermediateResult));
}
}
'लिखित' * का उपयोग करके जो कुछ भी आपने रखा है उसे पूरा करना 'रीड' द्वारा पढ़ा जा सकता है (सामान्य रूप से पाठक एक अंतर्निहित धारा पर बैठेगा जो केवल आपके लिए नहीं है), लेकिन * क्या * वास्तव में आप वास्तव में इस इंटरफ़ेस के क्लाइंट (सामान्य SQL सर्वर कोड में) के लिए अपारदर्शी है। –
मैं 'लिखें' विधि से 'सॉर्ट' लेता हूं। इससे पहले कि डेटा वास्तव में कॉलर्स के लिए * दृश्यमान * होता है, इसे 'रीड' के लिए कॉल द्वारा फिर से संसाधित किया जा रहा है और फिर (संभवतः कुछ 'मर्ज' के बाद) 'प्राप्त करने' के लिए 'टर्मिनेट' करने के लिए एक कॉल होगा वास्तविक परिणाम। –