C# MS SQL UserDefinedType Frage

roker002

Commander
Registriert
Dez. 2007
Beiträge
2.075
Wenn man UDT für MS SQL programmiert und ein komplexes UDT verwenden möchte, wie sollte man dann am besten vorgehen?

Ich möchte einen Wrapper machen, der mir erlaubt Dateien zu zippen. Dafür benutze ich die UDT Methoden um z.B. Dateien fest zu legen die gezippt werden möchten.

Problem ist, wenn der Typ kein struct ist und vor allem kein einfaches Objekt, dann kann man diesen nicht serialisieren.
Code:
    [Serializable]
    [SqlUserDefinedType(
        Format.UserDefined,
        Name = "ZipFile",
        IsByteOrdered = true,
        ValidationMethodName = "Validate",
        MaxByteSize = Constants.UserDefinedTypeMaxByte)]
    public struct DotNetZipStruct : IClrBase, IBinarySerialize, INullable, IEquatable<DotNetZipStruct>
    {
        private Boolean _IsNull;
        private String _File;
        private String _Entries;

        private Ionic.Zip.ZipFile _CurrentZipFile;

        [SqlMethod(OnNullCall = false)]
        public SqlInt32 AddItem(SqlString path)
        {
            this.Validate();
            this._CurrentZipFile.AddItem(path.Value, String.Empty);
            foreach (var item in this._CurrentZipFile) // <--- work around
                this._Entries = String.Concat(this._Entries, (this._Entries == null ? null : Environment.NewLine), item.FileName);
            return this._CurrentZipFile.Count;
        }

Code:
declare @z ZipFile = 'C:\CLR\myzip.zip'
select @z.AddItem('C:\CLR\')
select @z.Compress(null, null, null, null, null)

Offenbar wird das Objekt jedes mal deserialisiert und serialisiert. In den Beispiel, wir nach dem declare deserialisiert und vor dem AddItem serialisiert. Ist das jetzt so?
Ich dachte das so lange bis der Skript nicht vollständig ausgeführt wurde wird kein Serialisierung aufgerufen.
Ist das jetzt wirklich so?


EDIT
Falls jemand interesse hat, wie die Problemlösung aussieht, HIER geht es zum Quellcode
 
Zuletzt bearbeitet:
Zurück
Oben