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:
küme IsByteOrdered söyler true öznitelik SQL Server ısrarlı ikili gösterim karşılaştırmalarda kullanmak için .
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.
Kaydetme Currency UDT ikili aşağıdaki biçimi kullanarak:
Bayt 0-19'null karakterleri sağa doğru doldurma) ile kodlanmış UTF-16 dize olarak kültürü kaydedin.
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.