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.
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şlemeBIR 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
, ) XML
eş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 , , DATETIMEOFFSET
DATE
ve TIME
türleri DATETIME2
Microsoft 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 DATETIME
DATETIME2
dışı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 FILESTREAM
daha 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.