Aracılığıyla paylaş


Kullanıcı tanımlı türler kodlama

kullanıcı tanımlı tür (UDT) tanımınızı kodlama, olup, UDT bir sınıf veya bir yapı olarak, yaný sýra, seçtiğiniz biçimlendirme ve seri hale getirme seçenekleri uygulama bağlı olarak, çeşitli özelliklerini uygulamalıdır.

Uygulama, bu bölümdeki örnek gösterilmiştir bir Point UDT olarak bir struct (veya Structure Visual Basic'te). The Point UDT consists of X and Y coordinates implemented as özellik procedures.

Aşağıdaki ad bir UDT tanımlarken gereklidir:

Imports System
Imports System.Data.SqlTypes
Imports Microsoft.SqlServer.Server
using System;
using System.Data.SqlTypes;
using Microsoft.SqlServer.Server;

The Microsoft.SqlServer.Server namespace contains the objects required for various attributes of your UDT, and the System.Data.SqlTypes namespace contains the classes that represent SQL Server native data types available to the derleme. Kuşkusuz, düzgün çalışabilmesi için derleme gerektiren ek bir ad olabilir.The Point UDT also uses the System.Text namespace for working with strings.

Not

Ile başlayan SQL Server 2005Ile derlenmiş bir UDTs gibi visual C++ veritabanı nesneleri /clr:pure yürütme işlemi için desteklenmiyor.

Öznitelikleri belirtme

Öznitelik değeri için bir istemci tarafından seri hale getirme UDTs depolama gösterimini oluşturmak için ve UDTs iletmek için nasıl kullanılır belirler.

The Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute is required.The Serializable öznitelik is optional. Ayrıca belirtebilirsiniz Microsoft.SqlServer.Server.SqlFacetAttribute bir UDT dönüş türü hakkında bilgi sağlamak için . Daha fazla bilgi için bkz:CLR yordamları için özel öznitelikleri.

Nokta UDT öznitelikleri

The Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute sets the storage format for the Point UDT to Native.IsByteOrdered is set to true, which guarantees that the results of comparisons are the same in SQL Server as if the same comparison had taken place in managed code.UDT uygulayan System.Data.SqlTypes.INullable UDT null uyumlu hale getirmek için arabirim'ı tıklatın.

Aşağıdaki kod bölümü özniteliklerini gösterir Point udt.

<Serializable(), SqlUserDefinedTypeAttribute(Format.Native, _
  IsByteOrdered:=True)> _
  Public Structure Point
    Implements INullable
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native,
  IsByteOrdered=true)]
public struct Point : INullable
{

null atanabilirlik uygulama

Öznitelikleri, derlemeler için doğru belirtmenin yanı sıra, kendi UDT de null atanabilirlik desteklemelidir.Yüklenen UDTs SQL Server null tanıyan, ancak sırasıyla UDT, boş (null) değer tanıması için UDT uygulamalıdır System.Data.SqlTypes.INullable Arabirim.

Adında bir özellik oluşturmanız gerekir IsNull, CLR kodu içinde null bir değer olup olmadığını belirlemek için gerekli. Ne zaman SQL Server boş bir bulur örnek bir UDT normal null işleme yöntemlerini kullanarak, UDT kalıcıdır. Boşa sunucu için yok, boşa, null bir UDT depolamak için alan harcanmasına değil ise, UDT serisi kaldırılırken ya da saat seri hale getirilirken harcanmasına değil.Başka bir deyişle, kullanarak CLR getirilen bir UDT her saat null için bu onay gerçekleştirilir Transact-SQL NULL, null UDTs her saat çalışmalıdır için denetlenecek oluşturmak IS. The IsNull özellik is also used by the server to test whether an örnek is null. Bir kez sunucu UDT null belirler, kendi yerel null işleme kullanabilirsiniz.

The get() yöntem of IsNull is not special-cased in any way. Varsa bir Point değişken @p olan NullThen @p.IsNullVarsayılan olarak, "NULL", yok "1" değerlendirir. Bu, çünkü SqlMethod(OnNullCall) öznitelik IsNull get() false varsayılan yöntem. Nesne için Null, ne zaman özellik nesnenin serisi kaldırılan yöntem adı verilen ve "NULL" varsayılan değeri döndürdü istedi.

Örnek

Aşağıdaki örnekte, is_Null değişken özeldir ve UDT örnek için null durumunu içerir. Kodunuzu uygun bir değer tutmalıdır is_Null. UDT adında bir statik bir özelliğe sahip olmalıdır Null UDT boş (null) değer bir örneğini verir. Bu örnek, gerçekten veritabanında boş ise, boş (null) değer döndürmek bu UDT sağlar.

Private is_Null As Boolean

Public ReadOnly Property IsNull() As Boolean _
   Implements INullable.IsNull
    Get
        Return (is_Null)
    End Get
End Property

Public Shared ReadOnly Property Null() As Point
    Get
        Dim pt As New Point
        pt.is_Null = True
        Return (pt)
    End Get
End Property
private bool is_Null;

public bool IsNull
{
    get
    {
        return (is_Null);
    }
}

public static Point Null
{
    get
    {
        Point pt = new Point();
        pt.is_Null = true;
        return pt;
    }
}

NULL ve IS.Isnull

Burada (kimliği int, konum noktası), şema puanları içeren bir tabloda göz önünde bulundurun. Point Aşağıdaki sorgular ve bir CLR UDT şöyledir:

--Query 1
SELECT ID
FROM Points
WHERE NOT (location IS NULL) -- Or, WHERE location IS NOT NULL

--Query 2:
SELECT ID
FROM Points
WHERE location.IsNull = 0

Her iki sorgu noktalarıyla olmayan kimliklerinin dönmek-Null Yerler. Query 1'de, normal null işleme kullanılır ve yok bir seriyi kaldırma UDTs, gerekli yoktur.Sorgu 2, diğer yandan, her olmayan serisi kaldırılmaya vardır-Null Nesne ve değerini elde etmek için CLR call IsNull Özellik. Açıkça, kullanma IS NULL daha iyi performans sergiler ve okumak için bir neden hiçbir zaman gerektiğini IsNull bir UDT özellik Transact-SQL Kod.

Kullanımını nedir, IsNull Özellik?Ilk olarak bir değer olup olmadığını belirlemek için gereklidir Null gelen CLR içinde kod. Ikinci olarak, sunucunun bir örnek olup olmadığını sınamak için bir yol gerekir. Null, bu nedenle, bu özellik, sunucu tarafından kullanılır. Sonra onu belirler Null, sonra da dosyayı işlemek için kendi yerel null işleme kullanabilirsiniz.

Parse yöntem kullanma

The Parse and ToString methods allow for conversions to and from dize representations of the UDT. The Parse yöntem allows a dize to be converted into a UDT. Olarak bildirilmelidir static (veya Shared Visual Basic) ve bir parametre türü System.Data.SqlTypes.SqlString.

Aşağıdaki ımplements kod Parse yöntem için Point UDT dışında X ve Y koordinatları ayırır. The Parse yöntem has a single argument of type System.Data.SqlTypes.SqlString, and assumes that X and Y values are supplied as a comma-delimited dize. Ayarlama Microsoft.SqlServer.Server.SqlMethodAttribute.OnNullCall için öznitelik false engelleyen Parse null bir çaðrýlan gelen yöntem örnek noktası'nın.

<SqlMethod(OnNullCall:=False)> _
Public Shared Function Parse(ByVal s As SqlString) As Point
    If s.IsNull Then
        Return Null
    End If

    ' Parse input string here to separate out points.
    Dim pt As New Point()
    Dim xy() As String = s.Value.Split(",".ToCharArray())
    pt.X = Int32.Parse(xy(0))
    pt.Y = Int32.Parse(xy(1))
    Return pt
End Function
[SqlMethod(OnNullCall = false)]
public static Point Parse(SqlString s)
{
    if (s.IsNull)
        return Null;

    // Parse input string to separate out points.
    Point pt = new Point();
    string[] xy = s.Value.Split(",".ToCharArray());
    pt.X = Int32.Parse(xy[0]);
    pt.Y = Int32.Parse(xy[1]);
    return pt;
}

ToString yöntem uygulama

The ToString yöntem converts the Point UDT to a dize value. Bu durum, bir null örnek için "NULL" döndürülen dizgiyi Point TYPE. The ToString yöntem reverses the Parse yöntem by using a System.Text.StringBuilder to return a comma-delimited System.String consisting of the X and Y coordinate values. Çünkü InvokeIfReceiverIsNull Varsayılan olarak, false, null bir örneğini denetle Point gerekli değildir.

Private _x As Int32
Private _y As Int32

Public Overrides Function ToString() As String
    If Me.IsNull Then
        Return "NULL"
    Else
        Dim builder As StringBuilder = New StringBuilder
        builder.Append(_x)
        builder.Append(",")
        builder.Append(_y)
        Return builder.ToString
    End If
End Function
private Int32 _x;
private Int32 _y;

public override string ToString()
{
    if (this.IsNull)
        return "NULL";
    else
    {
        StringBuilder builder = new StringBuilder();
        builder.Append(_x);
        builder.Append(",");
        builder.Append(_y);
        return builder.ToString();
    }
}

UDT özellikleri açıklamanızı

The Point UDT exposes X and Y coordinates that are implemented as public read-write properties of type System.Int32.

Public Property X() As Int32
    Get
        Return (Me._x)
    End Get

    Set(ByVal Value As Int32)
        _x = Value
    End Set
End Property

Public Property Y() As Int32
    Get
        Return (Me._y)
    End Get

    Set(ByVal Value As Int32)
        _y = Value
    End Set
End Property
public Int32 X
{
    get
    {
        return this._x;
    }
    set 
    {
        _x = value;
    }
}

public Int32 Y
{
    get
    {
        return this._y;
    }
    set
    {
        _y = value;
    }
}

UDT değerleri doğrulanıyor

UDT verilerle çalışırken SQL Server Database Engine otomatik olarak ikili değerler UDT değerlere dönüştürür. Bu dönüştürme işlemi değer türü seri hale getirme biçimi için uygun olduğunu denetleme ve değer doğru serisi, sağlama içerir.Bu değeri ikili forma dönüştürülmesini sağlar.Bayt sipariş UDTs durumunda, bu da sonuçta elde edilen ikili değer, özgün ikili değer eşleşen sağlar.Bu, geçersiz değerler veritabanında kalıcı engeller.Bazı durumlarda, bu denetleme düzey, yetersiz olabilir.UDT değerler beklenen etki alanı veya aralık olması gerekli olduğunda ek doğrulama gerekli olabilir.Örneğin, bir tarih uygulayan bir UDT belirli geçerli değer aralık içinde yer alıyorsa, pozitif bir sayı gün değerin gereksinim duyabilir.

The Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.ValidationMethodName property of the Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute allows you to supply the name of a validation method that the server runs when data is assigned to a UDT or converted to a UDT.ValidationMethodName is also called during the running of the bcp utility, BULK INSERT, DBCC CHECKDB, DBCC CHECKFILEGROUP, DBCC CHECKTABLE, distributed query, and tabular data stream (TDS) remote procedure call (RPC) operations.Varsayılan değeri ValidationMethodName Hiçbir yöntem olduğunu gösteren, null.

Örnek

The following code fragment shows the bildirim for the Point class, which specifies a ValidationMethodName of ValidatePoint.

<Serializable(), SqlUserDefinedTypeAttribute(Format.Native, _
  IsByteOrdered:=True, _
  ValidationMethodName:="ValidatePoint")> _
  Public Structure Point
[Serializable]
[Microsoft.SqlServer.Server.SqlUserDefinedType(Format.Native,
  IsByteOrdered=true, 
  ValidationMethodName = "ValidatePoint")]
public struct Point : INullable
{

Bir doğrulama yöntem belirtilmezse, aşağıdaki kod bölümü gibi görünen bir imza geçersiz olmalıdır.

Private Function ValidationFunction() As Boolean
    If (validation logic here) Then
        Return True
    Else
        Return False
    End If
End Function
private bool ValidationFunction()
{
    if (validation logic here)
    {
        return true;
    }
    else
    {
        return false;
    }
}

Doğrulama yöntem, her kapsama sahip olabilir ve döndürmesi gerekir true Geçerli bir değer ise ve false Aksi durumda. Yöntem döndürüyorsa false veya bir özel durum atar, değer olarak işlem görür geçerli değil ve bir hata ortaya çıkar.

Aşağıdaki örnek kodu X ve Y koordinatları yalnızca sıfır veya daha büyük değerlere izin verir.

Private Function ValidatePoint() As Boolean
    If (_x >= 0) And (_y >= 0) Then
        Return True
    Else
        Return False
    End If
End Function
private bool ValidatePoint()
{
    if ((_x >= 0) && (_y >= 0))
    {
        return true;
    }
    else
    {
        return false;
    }
}

Doğrulama yöntem kısıtlamaları

Tek tek özellikler ayarlayarak veya verileri kullanarak eklendiğinde, veri eklendiğinde, dönüştürme, sunucu işlemi sırasında sunucu doğrulama yöntem çağırır bir Transact-SQL deyim INSERT.

Özellik ayarlayıcılar açıkça doğrulama yöntem çağırmalısınız ve Ayrıştırma yöntem tüm durumlarda yürütmek için doğrulama yöntem isterseniz.Bu zorunlu değildir ve bazı durumlarda bile uygun olmayabilir.

Doğrulama örneği ayrıştırılamadı.

Emin olmak ValidatePoint içinde yöntem etkin duruma getirilirNokta sınıfı, onu çağırmanız gerekirAyrıştırma yöntem ve özelliği yordamlar, küme X ve Y değerleri eşgüdümlemek.Aşağıdaki kod bölümü, aranacak gösterilmiştir ValidatePoint doğrulama yöntemAyrıştırma işlev.

<SqlMethod(OnNullCall:=False)> _
Public Shared Function Parse(ByVal s As SqlString) As Point
    If s.IsNull Then
        Return Null
    End If

    ' Parse input string here to separate out points.
    Dim pt As New Point()
    Dim xy() As String = s.Value.Split(",".ToCharArray())
    pt.X = Int32.Parse(xy(0))
    pt.Y = Int32.Parse(xy(1))

    ' Call ValidatePoint to enforce validation
    ' for string conversions.
    If Not pt.ValidatePoint() Then
        Throw New ArgumentException("Invalid XY coordinate values.")
    End If
    Return pt
End Function
[SqlMethod(OnNullCall = false)]
public static Point Parse(SqlString s)
{
    if (s.IsNull)
        return Null;

    // Parse input string to separate out points.
    Point pt = new Point();
    string[] xy = s.Value.Split(",".ToCharArray());
    pt.X = Int32.Parse(xy[0]);
    pt.Y = Int32.Parse(xy[1]);

    // Call ValidatePoint to enforce validation
    // for string conversions.
    if (!pt.ValidatePoint()) 
        throw new ArgumentException("Invalid XY coordinate values.");
    return pt;
}

Özellik doğrulaması örneği

Aşağıdaki kod bölümü, aranacak gösterilmiştir ValidatePoint X ve Y koordinatları ayarlı özellik yordamlar doğrulama yöntem.

Public Property X() As Int32
    Get
        Return (Me._x)
    End Get

    Set(ByVal Value As Int32)
        Dim temp As Int32 = _x
        _x = Value
        If Not ValidatePoint() Then
            _x = temp
            Throw New ArgumentException("Invalid X coordinate value.")
        End If
    End Set
End Property

Public Property Y() As Int32
    Get
        Return (Me._y)
    End Get

    Set(ByVal Value As Int32)
        Dim temp As Int32 = _y
        _y = Value
        If Not ValidatePoint() Then
            _y = temp
            Throw New ArgumentException("Invalid Y coordinate value.")
        End If
    End Set
End Property
    public Int32 X
{
    get
    {
        return this._x;
    }
    // Call ValidatePoint to ensure valid range of Point values.
    set 
    {
        Int32 temp = _x;
        _x = value;
        if (!ValidatePoint())
        {
            _x = temp;
            throw new ArgumentException("Invalid X coordinate value.");
        }
    }
}

public Int32 Y
{
    get
    {
        return this._y;
    }
    set
    {
        Int32 temp = _y;
        _y = value;
        if (!ValidatePoint())
        {
            _y = temp;
            throw new ArgumentException("Invalid Y coordinate value.");
        }
    }
}

Kodlama UDT yöntemleri

UDT yöntemleri kodlama sırasında kullanılan algoritma büyük olasılıkla zamanla değişebilir olup olmadığını göz önünde bulundurun.Bu durumda, kullanan kendi UDT yöntemleri için ayrı bir sınıf oluşturma dikkate isteyebilirsiniz.Algoritma değişirse, yeni kod sınıfıyla yeniden derleyin ve içine Derleme yüklenemedi SQL Server UDT etkilemeden. Çoğu durumda UDTs kullanarak yeniden yüklenmesi Transact-SQL ALTER derleme deyim, ancak, varolan verileri ile ilgili sorunları neden olabilecek. Örneğin, Para birimi UDT ile dahilAdventureWorks örnek veritabanını kullanırConvertCurrency işlev convert para birimi değerlerini ayrı bir sınıf içinde gerçekleştirilir.Dönüştürme algoritmalar gelecekte beklenmedik şekilde değiştirebilir veya bu yeni işlevi için gerekli olabilecek olanaklıdır.Ayırma ConvertCurrency işlevindenPara birimi UDT uygulaması, gelecekteki değişikliklere için planlama yaparken daha fazla esneklik sağlar.

Nasıl yükleneceği hakkında bilgi için AdventureWorks CLR örnekleri için "Örnekleri yükleme" konusuna bakın. SQL Server Çevrimiçi Kitapları.

Örnek

The Point class contains three simple methods for calculating distance: Uzaklık, DistanceFrom and DistanceFromXY.Her döndüren bir double kadar olan uzaklığı hesaplanıyor Point sıfır, belirli bir noktaya kadar olan uzaklığı Point, ve kadar olan uzaklığı X ve Y koordinatları için belirtilen... Point. Uzaklık and DistanceFrom her aramaDistanceFromXYve her yöntem için farklı bağımsız değişkenlerin nasıl kullanıldığını göstermektedir.

' Distance from 0 to Point.
<SqlMethod(OnNullCall:=False)> _
Public Function Distance() As Double
    Return DistanceFromXY(0, 0)
End Function

' Distance from Point to the specified point.
<SqlMethod(OnNullCall:=False)> _
Public Function DistanceFrom(ByVal pFrom As Point) As Double
    Return DistanceFromXY(pFrom.X, pFrom.Y)
End Function

' Distance from Point to the specified x and y values.
<SqlMethod(OnNullCall:=False)> _
Public Function DistanceFromXY(ByVal ix As Int32, ByVal iy As Int32) _
    As Double
    Return Math.Sqrt(Math.Pow(ix - _x, 2.0) + Math.Pow(iy - _y, 2.0))
End Function
// Distance from 0 to Point.
[SqlMethod(OnNullCall = false)]
public Double Distance()
{
    return DistanceFromXY(0, 0);
}

// Distance from Point to the specified point.
[SqlMethod(OnNullCall = false)]
public Double DistanceFrom(Point pFrom)
{
    return DistanceFromXY(pFrom.X, pFrom.Y);
}

// Distance from Point to the specified x and y values.
[SqlMethod(OnNullCall = false)]
public Double DistanceFromXY(Int32 iX, Int32 iY)
{
    return Math.Sqrt(Math.Pow(iX - _x, 2.0) + Math.Pow(iY - _y, 2.0));
}

SqlMethod öznitelikleri kullanma

The Microsoft.SqlServer.Server.SqlMethodAttribute class provides custom attributes that can be used to mark yöntem definitions in order to specify determinism, on null call behavior, and to specify whether a yöntem is a mutator. Bu özelliklerin varsayılan değerleri kabul edilir ve özel öznitelik yalnızca varsayılan olmayan bir değere gerek duyulduğunda kullanılır.

Not

The SqlMethodAttribute class inherits from the SqlFunctionAttribute class, so SqlMethodAttribute inherits the FillRowMethodName and TableDefinition fields from SqlFunctionAttribute.Bu durumda olmayan bir tablo değerli yöntem yazmak mümkün olduğunu gösterir.Yöntem derler ve derleme, bir hata hakkında dağıtır IEnumerable dönüş türü, aşağıdaki ileti zamanında oluşturulur: "yöntem, özellik veya alan '< adı > ' sınıf < > derlemede ' < derleme > ' class' dönüş türü geçersiz."

Aşağıdaki tabloda ilgili bazıları açıklanmaktadır. Microsoft.SqlServer.Server.SqlMethodAttribute UDT yöntemleri kullanılabilir ve varsayılan değerleri listeleyen özellikler.

  • DataAccess
    Işlev yerel örnek depolanan kullanıcı verilerine erişim ilgili olup olmadığını gösterir. SQL Server. Varsayılan değer DataAccessKind. None.

  • Isdeterministic
    işlev aynı çıkış değerleri aynı giriş değerleri ve aynı veritabanı durumunu üreten olup olmadığını gösterir.Varsayılan değer false.

  • IsMutator
    UDT örneğinde yöntem bir durum değişikliği neden olup olmadığını gösterir.Varsayılan değer false.

  • IsPrecise
    Işlev imprecise hesaplamaları, kayan nokta işlemleri gibi ilgili olup olmadığını gösterir.Varsayılan değer false.

  • OnNullCall
    Yöntem null başvuru giriş bağımsız değişkeni belirtildiğinde adlandırılır olup olmadığını gösterir.Varsayılan değer true.

Örnek

The Microsoft.SqlServer.Server.SqlMethodAttribute.IsMutator property allows you to mark a method that allows a change in the state of an instance of a UDT.Transact-SQL does not allow you to set two UDT properties in the SET clause of one UPDATE statement.Ancak, iki üyesi değiştiren bir mutator işaretlenmiş bir yöntem olabilir.

Not

Mutator yöntemleri sorgularda izin verilmez.Bunlar, yalnızca atama deyimleri veya veri değişikliği deyimleri çağrılabilir.Bir yöntem olarak işaretliyse, mutator döndürmüyor void (veya bir Sub Visual Basic'te), CREATE TÜRÜ, bir hata ile başarısız olur.

Aşağıdaki deyim varlığını varsayar bir Triangles UDT olan bir Rotate yöntem. Aşağıdaki Transact-SQL güncelleştirme deyimini çağırır Rotate yöntem:

UPDATE Triangles SET t.RotateY(0.6) WHERE id=5

The Rotate yöntem is decorated with the SqlMethod öznitelik setting IsMutator to true so that SQL Server can mark the yöntem as a mutator yöntem. Bu kod ayrıca ayarlar OnNullCall Kime false, yöntem bir null başvuru (döndürür, sunucuya gösterirNothing Visual Basic'te) varsa giriş parametresi null başvurulardır.

<SqlMethod(IsMutator:=True, OnNullCall:=False)> _
Public Sub Rotate(ByVal anglex as Double, _
  ByVal angley as Double, ByVal anglez As Double) 
   RotateX(anglex)
   RotateY(angley)
   RotateZ(anglez)
End Sub
[SqlMethod(IsMutator = true, OnNullCall = false)]
public void Rotate(double anglex, double angley, double anglez) 
{
   RotateX(anglex);
   RotateY(angley);
   RotateZ(anglez);
}

Kullanıcı tanımlı bir biçimi ile ilgili bir UDT uygulama

Kullanıcı tanımlı bir biçimi ile ilgili bir UDT uygularken, uygulamalıdır Read ve Write seri hale getirilirken ve UDT veri serisi kaldırılırken Microsoft.SqlServer.Server.IBinarySerialize arabirimini uygulayan yöntemler. Ayrıca belirtmelisiniz MaxByteSize özellik Microsoft.SqlServer.Server.SqlUserDefinedTypeAttribute.

UDT para birimi

The Currency UDT is included with the CLR samples that can be installed with SQL Server, beginning with SQL Server 2005.CLR örneklerini yükleme hakkında daha fazla bilgi için bkz: SQL Server Örnekleri ve Örnek Veritabanlarının Yüklenmesiyle İlgili Önemli Noktalar.

The Currency UDT supports handling amounts of money in the monetary system of a particular culture.Iki alan tanımlamanız gerekir: a string için CultureInfo, kimin para verilen belirtir (en-us, örneğin) ve bir decimal için CurrencyValue, para tutarı.

Bu sunucu tarafından karşılaştırmaları yapmak için kullanılmaz, ancak Currency UDT uygulayan System.IComparable tek bir yöntem sunar, arabirim System.IComparable.CompareTo. Bu, istemci tarafında doğru şekilde karşılaştırmak veya sipariş para birimi değerlerinin kültürler için uygun olduğu durumlarda kullanılır.

CLR içinde çalışan kod alanından ayrı olarak para birimi değeri kültür karşılaştırır.Için Transact-SQL kod, aşağıdaki eylemleri karşılaştırma belirleyin:

  1. küme IsByteOrdered söyler true öznitelik SQL Server ısrarlı ikili gösterim karşılaştırmalarda kullanmak için .

  2. Use Write yöntem için Currency UDT the UDT nasıl kalıcıdır belirlemek için disk ve bu nedenle UDT değerlerin nasıl karşılaştırılır ve için sipariş Transact-SQL operasyonlar.

  3. Kaydetme Currency UDT ikili aşağıdaki biçimi kullanarak:

    1. Bayt 0-19'null karakterleri sağa doğru doldurma) ile kodlanmış UTF-16 dize olarak kültürü kaydedin.

    2. 20 Bayt kullanır ve yukarıdaki para birimi ondalık değeri içeriyor.

Doldurma amacı, başka bir programda karşı bir UDT karşılaştırılır, kültürü tamamen para birimi değeri, ayrılmış sağlamaktır Transact-SQL kod, kültür bayt kültür bayt karşı karşılaştırılır ve bayt değerleri para birimi döviz bayt değerleri karşılaştırılır.

Tam kod için listesini için Currency UDT, CLR yükleme yönergeleri örnekler izleme SQL Server Örnekleri ve Örnek Veritabanlarının Yüklenmesiyle İlgili Önemli Noktalar.

Para birimi öznitelikleri

The Currency UDT is defined with the following attributes.

<Serializable(), Microsoft.SqlServer.Server.SqlUserDefinedType( _
    Microsoft.SqlServer.Server.Format.UserDefined, _
    IsByteOrdered:=True, MaxByteSize:=32), _
    CLSCompliant(False)> _
Public Structure Currency
Implements INullable, IComparable, _
Microsoft.SqlServer.Server.IBinarySerialize
[Serializable]
[SqlUserDefinedType(Format.UserDefined, 
    IsByteOrdered = true, MaxByteSize = 32)]
    [CLSCompliant(false)]
    public struct Currency : INullable, IComparable, IBinarySerialize
    {

Okuma ve oluşturma yöntemleri IBinarySerialize ile yazma

Seçtiğinizde UserDefined seri hale getirme biçimi, siz de uygulamalıdır IBinarySerialize arabirim ve kendi oluşturma Read ve Write yöntemleri. Aşağıdaki yordamlar gelen Currency UDT use System.IO.BinaryReader ve System.IO.BinaryWriter Okuma için UDT yazmak için.

' IBinarySerialize methods
' The binary layout is as follow:
'    Bytes 0 - 19: Culture name, padded to the right with null
'    characters, UTF-16 encoded
'    Bytes 20+: Decimal value of money
' If the culture name is empty, the currency is null.
Public Sub Write(ByVal w As System.IO.BinaryWriter) _
  Implements Microsoft.SqlServer.Server.IBinarySerialize.Write
    If Me.IsNull Then
        w.Write(nullMarker)
        w.Write(System.Convert.ToDecimal(0))
        Return
    End If

    If cultureName.Length > cultureNameMaxSize Then
        Throw New ApplicationException(String.Format(CultureInfo.CurrentUICulture, _
           "{0} is an invalid culture name for currency as it is too long.", cultureNameMaxSize))
    End If

    Dim paddedName As String = cultureName.PadRight(cultureNameMaxSize, CChar(vbNullChar))

    For i As Integer = 0 To cultureNameMaxSize - 1
        w.Write(paddedName(i))
    Next i

    ' Normalize decimal value to two places
    currencyVal = Decimal.Floor(currencyVal * 100) / 100
    w.Write(currencyVal)
End Sub

Public Sub Read(ByVal r As System.IO.BinaryReader) _
  Implements Microsoft.SqlServer.Server.IBinarySerialize.Read
    Dim name As Char() = r.ReadChars(cultureNameMaxSize)
    Dim stringEnd As Integer = Array.IndexOf(name, CChar(vbNullChar))

    If stringEnd = 0 Then
        cultureName = Nothing
        Return
    End If

    cultureName = New String(name, 0, stringEnd)
    currencyVal = r.ReadDecimal()
End Sub
// IBinarySerialize methods
// The binary layout is as follow:
//    Bytes 0 - 19:Culture name, padded to the right 
//    with null characters, UTF-16 encoded
//    Bytes 20+:Decimal value of money
// If the culture name is empty, the currency is null.
public void Write(System.IO.BinaryWriter w)
{
    if (this.IsNull)
    {
        w.Write(nullMarker);
        w.Write((decimal)0);
        return;
    }

    if (cultureName.Length > cultureNameMaxSize)
    {
        throw new ApplicationException(string.Format(
            CultureInfo.InvariantCulture, 
            "{0} is an invalid culture name for currency as it is too long.", 
            cultureNameMaxSize));
    }

    String paddedName = cultureName.PadRight(cultureNameMaxSize, '\0');
    for (int i = 0; i < cultureNameMaxSize; i++)
    {
        w.Write(paddedName[i]);
    }

    // Normalize decimal value to two places
    currencyValue = Decimal.Floor(currencyValue * 100) / 100;
    w.Write(currencyValue);
}
public void Read(System.IO.BinaryReader r)
{
    char[] name = r.ReadChars(cultureNameMaxSize);
    int stringEnd = Array.IndexOf(name, '\0');

    if (stringEnd == 0)
    {
        cultureName = null;
        return;
    }

    cultureName = new String(name, 0, stringEnd);
    currencyValue = r.ReadDecimal();
}

Tam kod için listesini için Currency UDT, bkz: SQL Server Örnekleri ve Örnek Veritabanlarının Yüklenmesiyle İlgili Önemli Noktalar.