2010-08-19 9 views
2

J'essaie d'ajouter une fonction d'agrégation dans SQL Server 2005 via C#. Mais quand je Déployez le projet échoue avec l'erreur suivante:Sérialisation de liste dans la fonction d'agrégation CLR C#

.Net SqlClient Data Provider: Msg 6222, Level 16, State 1, Line 1 Type "AggregationTest.CountNonintersectingIntervals" is marked for native serialization, but field "intervals" of type "AggregationTest.CountNonintersectingIntervals" is not valid for native serialization

Voici le code que je utilise:

[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native)] 
public struct Interval : INullable 
{ 

    public Interval(int beginning, int ending) : this() 
    { 
     this.beginning = beginning; 
     this.ending = ending; 
    } 

    public override string ToString() 
    { 
     return "(" + beginning + ", " + ending + ")"; 
    } 

    public bool IsNull { get { return m_Null; } } 

    public static Interval Null { get { /*Some code*/ } } 

    public static Interval Parse(SqlString s) 
    { 
     /*Some code*/ 
    } 

    public int beginning; 
    public int ending; 
    private bool m_Null; 
} 

[Serializable] 
[Microsoft.SqlServer.Server.SqlUserDefinedAggregate(Format.Native)] 
public struct CountNonintersectingIntervals 
{ 
    public void Init() 
    { 
     intervals = new List<Interval>(); 
    } 

    public void Accumulate(Interval interval) 
    { 
     intervals.Add(interval); 
    } 

    public void Merge(CountNonintersectingIntervals Group) 
    { 
     intervals.AddRange(Group.intervals); 
    } 

    public SqlInt32 Terminate() 
    { 
     // Some complicated calculation using intervals 
    } 

    private List<Interval> intervals; 
} 

Pourriez-vous s'il vous plaît me aider à résoudre le problème

Répondre

1

Vous devez initialiser l'attribut SqlUserDefinedAggregate comme Format.UserDefined et mettre en œuvre IBinarySerialize interface pour prendre soin de votre instance intervals.