Aracılığıyla paylaş


SQL-CLR Tür Eşlemesi

LINQ to SQL'de ilişkisel veritabanının veri modeli, seçtiğiniz programlama dilinde ifade edilen bir nesne modeliyle eşler. Uygulama çalıştırıldığında LINQ to SQL, nesne modelindeki dille tümleşik sorguları SQL'e çevirir ve yürütülmek üzere veritabanına gönderir. Veritabanı sonuçları döndürdüğünde, LINQ to SQL sonuçları kendi programlama dilinizde çalışabileceğiniz nesnelere çevirir.

Nesne modeli ile veritabanı arasında veri çevirmek için bir tür eşlemesi tanımlanmalıdır. LINQ to SQL, her ortak dil çalışma zamanı (CLR) türünü belirli bir SQL Server türüyle eşleştirmek için bir tür eşlemesi kullanır. Tür eşlemelerini ve veritabanı yapısı ve tablo ilişkileri gibi diğer eşleme bilgilerini öznitelik tabanlı eşleme ile nesne modelinin içinde tanımlayabilirsiniz. Alternatif olarak, eşleme bilgilerini dış eşleme dosyasıyla nesne modelinin dışında belirtebilirsiniz. Daha fazla bilgi için bkz . Öznitelik Tabanlı Eşleme ve Dış Eşleme.

Bu konuda aşağıdaki noktalar açıklanmaktadır:

Varsayılan Tür Eşlemesi

nesne modelini veya dış eşleme dosyasını Nesne İlişkisel Tasarımcısı (O/R Tasarım Aracı) veya SQLMetal komut satırı aracıyla otomatik olarak oluşturabilirsiniz. Bu araçların varsayılan tür eşlemeleri, SQL Server veritabanı içindeki sütunlara eşlemek için hangi CLR türlerinin seçildiğini tanımlar. Bu araçları kullanma hakkında daha fazla bilgi için bkz . Nesne Modeli Oluşturma.

Yöntemini kullanarak CreateDatabase nesne modelindeki veya dış eşleme dosyasındaki eşleme bilgilerini temel alan bir SQL Server veritabanı da oluşturabilirsiniz. yöntemi için varsayılan tür eşlemeleri, nesne modelindeki CreateDatabase CLR türlerine eşlemek için hangi tür SQL Server sütunlarının oluşturulduğunu tanımlar. Daha fazla bilgi için bkz . Nasıl yapılır: Dinamik Olarak Veritabanı Oluşturma.

Tür Eşleme Çalışma Zamanı Davranış Matrisi

Aşağıdaki diyagramda, veritabanından veri alındığında veya veritabanına kaydedildiğinde belirli tür eşlemelerinin beklenen çalışma zamanı davranışı gösterilmektedir. Serileştirme dışında, LINQ to SQL bu matriste belirtilmeyen CLR veya SQL Server veri türleri arasında eşlemeyi desteklemez. Serileştirme desteği hakkında daha fazla bilgi için bkz . İkili Serileştirme.

SQL Server to SQL CLR data type mapping table

Not

Bazı tür eşlemeleri, veritabanına veya veritabanından çeviri yaparken taşma veya veri kaybı özel durumlarına neden olabilir.

Özel Tür Eşlemesi

LINQ to SQL ile O/R Tasarım Aracı, SQLMetal ve CreateDatabase yöntemi tarafından kullanılan varsayılan tür eşlemeleriyle sınırlı değildir. Bir DBML dosyasında açıkça belirterek özel tür eşlemeleri oluşturabilirsiniz. Ardından bu DBML dosyasını kullanarak nesne modeli kodunu ve eşleme dosyasını oluşturabilirsiniz. Daha fazla bilgi için bkz . SQL-CLR Özel Tür Eşlemeleri.

CLR ile SQL YürütmeSi Arasındaki Davranış Farkları

CLR ile SQL Server arasındaki duyarlık ve yürütme farklılıkları nedeniyle, hesaplamalarınızı nerede yaptığınıza bağlı olarak farklı sonuçlar alabilir veya farklı davranışlarla karşılaşabilirsiniz. LINQ to SQL sorgularında gerçekleştirilen hesaplamalar aslında Transact-SQL'e çevrilir ve ardından SQL Server veritabanında yürütülür. LINQ to SQL sorguları dışında gerçekleştirilen hesaplamalar CLR bağlamında yürütülür.

Örneğin, CLR ile SQL Server arasındaki davranış farklılıkları şunlardır:

  • SQL Server bazı veri türlerini CLR'deki eşdeğer türdeki verilerden farklı bir şekilde sıralar. Örneğin, türünde SQL Server verileri türüne UNIQUEIDENTIFIER göre CLR verilerinden System.Guidfarklı sıralanır.

  • SQL Server bazı dize karşılaştırma işlemlerini CLR'den farklı işler. SQL Server'da dize karşılaştırma davranışı, sunucudaki harmanlama ayarlarına bağlıdır. Daha fazla bilgi için bkz . Harmanlamalarla Çalışma.

  • SQL Server, bazı eşlenmiş işlevler için CLR'den farklı değerler döndürebilir. Örneğin, SQL Server iki dizeyi yalnızca sondaki boşlukta farklıysa eşit olarak kabul ettiğinden eşitlik işlevleri farklılık gösterir; ancak CLR bunları eşit değil olarak kabul eder.

Sabit Listesi Eşlemesi

LINQ to SQL, CLR System.Enum türünü SQL Server türlerine eşlemeyi iki şekilde destekler:

  • SQL sayısal türlerine (TINYINT, SMALLINT, INT, BIGINT) eşleme

    BIR CLR System.Enum türünü bir SQL sayısal türüyle eşlediğinizde, CLR'nin System.Enum temel alınan tamsayı değerini SQL Server veritabanı sütununun değeriyle eşlersiniz. Örneğin, adlandırılmış DaysOfWeek bir System.Enum üye, temel alınan tamsayı değeri 3 olan adlı Tue bir üye içeriyorsa, bu üye 3 veritabanı değeriyle eşler.

  • SQL metin türleriyle eşleme (CHAR, NCHAR, VARCHAR, NVARCHAR)

    BIR CLR System.Enum türünü bir SQL metin türüyle eşlediğinizde, SQL veritabanı değeri CLR System.Enum üyelerinin adlarına eşlenir. Örneğin, adlandırılmış bir System.Enum üye, temel alınan tamsayı değeri 3 olan adlı Tue bir üye içeriyorsa, bu üye veritabanı değeriyle eşlerTue.DaysOfWeek

Not

SQL metin türlerini bir CLR System.Enumile eşlerken, yalnızca eşlenen SQL sütunundaki üyelerin adlarını Enum ekleyin. Eşlenmiş SQL sütununda diğer değerler desteklenmez Enum.

O/R Tasarım Aracı ve SQLMetal komut satırı aracı bir SQL türünü otomatik olarak bir CLR Enum sınıfına eşleyemez. Bir DBML dosyasını O/R Tasarım Aracı ve SQLMetal tarafından kullanılmak üzere özelleştirerek bu eşlemeyi açıkça yapılandırmanız gerekir. Özel tür eşlemesi hakkında daha fazla bilgi için bkz . SQL-CLR Özel Tür Eşlemeleri.

Numaralandırmaya yönelik bir SQL sütunu diğer sayısal ve metin sütunlarıyla aynı türde olacağı için; bu araçlar amacınızı tanımaz ve aşağıdaki Sayısal Eşleme ve Metin ve XML Eşlemesi bölümlerinde açıklandığı gibi eşlemeye varsayılan olarak kullanılır. DBML dosyasıyla kod oluşturma hakkında daha fazla bilgi için bkz . LINQ to SQL'de Kod Oluşturma.

yöntemi, DataContext.CreateDatabase bir CLR System.Enum türünü eşlemek için sayısal türde bir SQL sütunu oluşturur.

Sayısal Eşleme

LINQ to SQL, birçok CLR ve SQL Server sayısal türünü eşlemenizi sağlar. Aşağıdaki tabloda, veritabanınızı temel alan bir nesne modeli veya dış eşleme dosyası oluştururken O/R'nin Tasarım Aracı ve SQLMetal'in seçtiği CLR türleri gösterilmektedir.

SQL Server Türü O/R Tasarım Aracı ve SQLMetal tarafından kullanılan varsayılan CLR Türü eşlemesi
BIT System.Boolean
TINYINT System.Int16
INT System.Int32
BIGINT System.Int64
SMALLMONEY System.Decimal
MONEY System.Decimal
DECIMAL System.Decimal
NUMERIC System.Decimal
REAL/FLOAT(24) System.Single
FLOAT/FLOAT(53) System.Double

Sonraki tabloda, nesne modelinizde veya dış eşleme dosyanızda tanımlanan CLR türlerine eşlemek için hangi tür SQL sütunlarının oluşturulduğunu tanımlamak için yöntemi tarafından DataContext.CreateDatabase kullanılan varsayılan tür eşlemeleri gösterilir.

CLR Türü Tarafından kullanılan varsayılan SQL Server Türü DataContext.CreateDatabase
System.Boolean BIT
System.Byte TINYINT
System.Int16 SMALLINT
System.Int32 INT
System.Int64 BIGINT
System.SByte SMALLINT
System.UInt16 INT
System.UInt32 BIGINT
System.UInt64 DECIMAL(20)
System.Decimal DECIMAL(29,4)
System.Single REAL
System.Double FLOAT

Seçebileceğiniz başka birçok sayısal eşleme vardır, ancak bazıları veritabanına veya veritabanından çeviri yaparken taşma veya veri kaybı özel durumlarına neden olabilir. Daha fazla bilgi için bkz . Tür Eşleme Çalışma Zamanı Davranış Matrisi.

Ondalık ve Para Türleri

SQL Server DECIMAL türünün varsayılan duyarlığı (ondalık noktasının solunda ve sağındaki 18 ondalık basamak), varsayılan olarak eşleştirilen CLR System.Decimal türünün duyarlığından çok daha küçüktür. Bu, verileri veritabanına kaydettiğinizde duyarlık kaybına neden olabilir. Ancak, SQL Server DECIMAL türü 29 basamaktan fazla duyarlıkla yapılandırılırsa tam tersi oluşabilir. BIR SQL Server DECIMAL türü CLR'den System.Decimaldaha büyük bir duyarlıkla yapılandırıldığında, veritabanından veri alınırken duyarlık kaybı oluşabilir.

Varsayılan olarak CLR System.Decimal türüyle de eşleştirilen SQL Server MONEY ve SMALLMONEY türleri çok daha küçük bir duyarlıkta sahiptir ve bu da verileri veritabanına kaydederken taşma veya veri kaybı özel durumlarına neden olabilir.

Metin ve XML Eşlemesi

LINQ ile SQL arasında eşleyebileceğiniz birçok metin tabanlı ve XML türü de vardır. Aşağıdaki tabloda, veritabanınızı temel alan bir nesne modeli veya dış eşleme dosyası oluştururken O/R'nin Tasarım Aracı ve SQLMetal'in seçtiği CLR türleri gösterilmektedir.

SQL Server Türü O/R Tasarım Aracı ve SQLMetal tarafından kullanılan varsayılan CLR Türü eşlemesi
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

Sonraki tabloda, nesne modelinizde veya dış eşleme dosyanızda tanımlanan CLR türlerine eşlemek için hangi tür SQL sütunlarının oluşturulduğunu tanımlamak için yöntemi tarafından DataContext.CreateDatabase kullanılan varsayılan tür eşlemeleri gösterilir.

CLR Türü Tarafından kullanılan varsayılan SQL Server Türü DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
ve uygulayan Parse() özel tür ToString() NVARCHAR(MAX)

Seçebileceğiniz başka birçok metin tabanlı ve XML eşlemesi vardır, ancak bazıları veritabanına veya veritabanından çeviri yaparken taşma veya veri kaybı özel durumlarına neden olabilir. Daha fazla bilgi için bkz . Tür Eşleme Çalışma Zamanı Davranış Matrisi.

XML Türleri

SQL Server veri türü Microsoft SQL Server XML 2005'den itibaren kullanılabilir. SQL Server XML veri türünü XElement, XDocumentveya Stringile eşleyebilirsiniz. Sütunda içine okunamayan XElementXML parçaları depolanırsa, çalışma zamanı hatalarını önlemek için String sütunun eşlenmesi gerekir. Aşağıdakileri içerecek şekilde String eşlenmesi gereken XML parçaları:

  • XML öğeleri dizisi

  • Özellikler

  • Ortak Tanımlayıcılar (PI)

  • Açıklamalar

Tür Eşleme Çalışma Zamanı Davranış Matrisi'nde gösterildiği gibi SQL XDocument Server ile eşleyebilirsiniz XElement ancak yöntemin DataContext.CreateDatabase bu türler için varsayılan SQL Server tür eşlemesi yoktur.

Özel Türler

Bir sınıf ve ToString()uygularsaParse(), nesnesini herhangi bir SQL metin türüne (CHAR, NCHAR, VARCHAR, , NVARCHAR, TEXT, NTEXT, ) XMLeşleyebilirsiniz. nesnesi tarafından döndürülen ToString() değer eşlenen veritabanı sütununa gönderilerek veritabanında depolanır. nesnesi, veritabanı tarafından döndürülen dizede çağrılarak Parse() yeniden oluşturulur.

Not

LINQ to SQL, kullanılarak System.Xml.Serialization.IXmlSerializableserileştirmeyi desteklemez.

Tarih ve Saat Eşlemesi

LINQ to SQL ile birçok SQL Server tarih ve saat türünü eşleyebilirsiniz. Aşağıdaki tabloda, veritabanınızı temel alan bir nesne modeli veya dış eşleme dosyası oluştururken O/R'nin Tasarım Aracı ve SQLMetal'in seçtiği CLR türleri gösterilmektedir.

SQL Server Türü O/R Tasarım Aracı ve SQLMetal tarafından kullanılan varsayılan CLR Türü eşlemesi
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

Sonraki tabloda, nesne modelinizde veya dış eşleme dosyanızda tanımlanan CLR türlerine eşlemek için hangi tür SQL sütunlarının oluşturulduğunu tanımlamak için yöntemi tarafından DataContext.CreateDatabase kullanılan varsayılan tür eşlemeleri gösterilir.

CLR Türü Tarafından kullanılan varsayılan SQL Server Türü DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

Seçebileceğiniz başka birçok tarih ve saat eşlemesi vardır, ancak bazıları veritabanına veya veritabanından çeviri yaparken taşma veya veri kaybı özel durumlarına neden olabilir. Daha fazla bilgi için bkz . Tür Eşleme Çalışma Zamanı Davranış Matrisi.

Not

SQL Server , , DATETIMEOFFSETDATEve TIME türleri DATETIME2Microsoft SQL Server 2008'den itibaren kullanılabilir. LINQ to SQL, .NET Framework sürüm 3.5 SP1'den başlayarak bu yeni türlerle eşlemeyi destekler.

Datetime

CLR System.DateTime türünün aralığı ve duyarlığı, yöntemi için varsayılan tür eşlemesi olan SQL Server DATETIME türünün aralığı ve duyarlığından DataContext.CreateDatabase büyüktür. aralığının DATETIMEDATETIME2dışındaki tarihlerle ilgili özel durumları önlemeye yardımcı olmak için, Microsoft SQL Server 2008'den itibaren kullanılabilen kullanın. DATETIME2 , CLR'nin System.DateTimearalığı ve duyarlığıyla eşleşebilir.

SQL Server tarihlerinde TimeZoneCLR'de zengin bir şekilde desteklenen bir özellik kavramı yoktur. TimeZonedeğerler, özgün DateTimeKind bilgiler ne olursa olsun dönüştürme olmadan TimeZone veritabanına olduğu gibi kaydedilir. DateTime Değerler veritabanından alındığında, değerleri ile olduğu DateTimeKindUnspecifiedgibi DateTime yüklenir. Desteklenen System.DateTime yöntemler hakkında daha fazla bilgi için bkz . System.DateTime Yöntemleri.

Timespan

Microsoft SQL Server 2008 ve .NET Framework 3.5 SP1, CLR System.TimeSpan türünü SQL Server TIME türüyle eşlemenize olanak verir. Ancak, CLR'nin System.TimeSpan desteklediği aralık ile SQL Server TIME türünün desteklediği aralık arasında büyük bir fark vardır. 0'dan küçük veya 23:59:59.9999999 saatten büyük değerlerin SQL'e TIME eşlenirken taşma özel durumları ortaya çıkacaktır. Daha fazla bilgi için bkz . System.TimeSpan Yöntemleri.

Microsoft SQL Server 2000 ve SQL Server 2005'te veritabanı alanlarını ile TimeSpaneşleyemezsiniz. Ancak, değerler çıkarmadan DateTime döndürülebildiğinden veya bir ifadeye değişmez veya bağlı değişken olarak getirilebildiği için üzerindeki TimeSpan işlemler desteklenirTimeSpan.

İkili Eşleme

CLR türüyle eşlenebilir birçok SQL Server türü System.Data.Linq.Binaryvardır. Aşağıdaki tabloda, veritabanınızı temel alan bir nesne modeli veya dış eşleme dosyası oluştururken O/R Tasarım Aracı ve SQLMetal'in CLR System.Data.Linq.Binary türü tanımlamasına neden olan SQL Server türleri gösterilmektedir.

SQL Server Türü O/R Tasarım Aracı ve SQLMetal tarafından kullanılan varsayılan CLR Türü eşlemesi
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX)özniteliğiyle FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

Sonraki tabloda, nesne modelinizde veya dış eşleme dosyanızda tanımlanan CLR türlerine eşlemek için hangi tür SQL sütunlarının oluşturulduğunu tanımlamak için yöntemi tarafından DataContext.CreateDatabase kullanılan varsayılan tür eşlemeleri gösterilir.

CLR Türü Tarafından kullanılan varsayılan SQL Server Türü DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

Seçebileceğiniz başka birçok ikili eşleme vardır, ancak bazıları veritabanına veya veritabanından çeviri yaparken taşma veya veri kaybı özel durumlarına neden olabilir. Daha fazla bilgi için bkz . Tür Eşleme Çalışma Zamanı Davranış Matrisi.

SQL Server FILESTREAM

Sütunların FILESTREAM özniteliği VARBINARY(MAX) Microsoft SQL Server 2008'den itibaren kullanılabilir; .NET Framework sürüm 3.5 SP1'den başlayarak LINQ ile SQL'e eşleyebilirsiniz.

Özniteliğiyle sütunları nesnelere eşleyebilmenize VARBINARY(MAX)Binary rağmen, DataContext.CreateDatabase yöntemi özniteliğiyle FILESTREAM sütunları otomatik olarak oluşturamazFILESTREAM. hakkında FILESTREAMdaha fazla bilgi için bkz . FILESTREAM'a Genel Bakış.

İkili Serileştirme

Bir sınıf arabirimini uygularsa ISerializable , bir nesneyi herhangi bir SQL ikili alanına (BINARY, VARBINARY, IMAGE) seri hale getirebilirsiniz. Nesnesi, arabirimin nasıl uygulandığına göre serileştirilir ve seri durumdan ISerializable çıkarılır. Daha fazla bilgi için bkz . İkili Serileştirme.

Çeşitli Eşleme

Aşağıdaki tabloda, henüz bahsedilmemiş bazı çeşitli türler için varsayılan tür eşlemeleri gösterilmektedir. Aşağıdaki tabloda, veritabanınızı temel alan bir nesne modeli veya dış eşleme dosyası oluştururken O/R'nin Tasarım Aracı ve SQLMetal'in seçtiği CLR türleri gösterilmektedir.

SQL Server Türü O/R Tasarım Aracı ve SQLMetal tarafından kullanılan varsayılan CLR Türü eşlemesi
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

Sonraki tabloda, nesne modelinizde veya dış eşleme dosyanızda tanımlanan CLR türlerine eşlemek için hangi tür SQL sütunlarının oluşturulduğunu tanımlamak için yöntemi tarafından DataContext.CreateDatabase kullanılan varsayılan tür eşlemeleri gösterilir.

CLR Türü Tarafından kullanılan varsayılan SQL Server Türü DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL, bu çeşitli türler için başka tür eşlemelerini desteklemez. Daha fazla bilgi için bkz . Tür Eşleme Çalışma Zamanı Davranış Matrisi.

Ayrıca bkz.