Bagikan melalui


Pemetaan Jenis SQL-CLR

Di LINQ to SQL, model data dari database relasional dipetakan ke model objek yang diekspresikan dalam bahasa pemrograman pilihan Anda. Saat aplikasi berjalan, LINQ to SQL menerjemahkan kueri yang terintegrasi dengan bahasa dalam model objek ke dalam SQL dan mengirimkannya ke database untuk dieksekusi. Saat database mengembalikan hasil, LINQ to SQL menerjemahkan hasilnya kembali ke objek yang dapat Anda gunakan dalam bahasa pemrograman Anda sendiri.

Untuk menerjemahkan data antara model objek dan database, pemetaan jenis harus ditentukan. LINQ to SQL menggunakan pemetaan jenis untuk mencocokkan setiap jenis runtime bahasa umum (CLR) dengan jenis SQL Server tertentu. Anda dapat menentukan pemetaan jenis dan informasi pemetaan lainnya, seperti struktur database dan hubungan tabel, di dalam model objek dengan pemetaan berbasis atribut. Atau, Anda dapat menentukan informasi pemetaan di luar model objek dengan file pemetaan eksternal. Untuk informasi selengkapnya, lihat Pemetaan Berbasis Atribut dan Pemetaan Eksternal.

Topik ini membahas poin-poin berikut:

Pemetaan Jenis Default

Anda dapat membuat model objek atau file pemetaan eksternal secara otomatis dengan Object Relational Designer (O/R Designer) atau alat baris perintah SQLMetal. Pemetaan jenis default untuk alat ini menentukan jenis CLR mana yang dipilih untuk dipetakan ke kolom di dalam database SQL Server. Untuk informasi selengkapnya tentang menggunakan alat ini, lihat Membuat Model Objek.

Anda juga dapat menggunakan metode CreateDatabase untuk membuat database SQL Server berdasarkan informasi pemetaan dalam model objek atau file pemetaan eksternal. Pemetaan jenis default untuk metode CreateDatabase menentukan jenis kolom SQL Server yang dibuat untuk dipetakan ke jenis CLR dalam model objek. Untuk informasi selengkapnya, lihat Cara: Membuat Database secara dinamis.

Matriks Perilaku Runtime Pemetaan Jenis

Diagram berikut menunjukkan perilaku runtime yang diharapkan dari pemetaan jenis tertentu saat data diambil dari atau disimpan ke database. Dengan pengecualian serialisasi, LINQ to SQL tidak mendukung pemetaan antara jenis data CLR atau SQL Server yang tidak ditentukan dalam matriks ini. Untuk informasi selengkapnya tentang dukungan serialisasi, lihat Serialisasi Biner.

SQL Server to SQL CLR data type mapping table

Catatan

Beberapa pemetaan jenis dapat mengakibatkan pengecualian luapan atau kehilangan data saat menerjemahkan ke atau dari database.

Pemetaan Jenis Kustom

Dengan LINQ to SQL, Anda tidak terbatas pada pemetaan jenis default yang digunakan oleh O/R Designer, SQLMetal, dan metode CreateDatabase. Anda dapat membuat pemetaan jenis kustom dengan menetapkannya secara eksplisit dalam file DBML. Kemudian Anda dapat menggunakan file DBML tersebut untuk membuat kode model objek dan file pemetaan. Untuk informasi selengkapnya, lihat Pemetaan Jenis Kustom SQL-CLR.

Perbedaan Perilaku Antara CLR dan Eksekusi SQL

Karena perbedaan presisi dan eksekusi antara CLR dan SQL Server, Anda mungkin menerima hasil yang berbeda atau mengalami perilaku yang berbeda tergantung di mana Anda melakukan perhitungan Anda. Perhitungan yang dilakukan dalam kueri LINQ to SQL sebenarnya diterjemahkan ke Transact-SQL dan kemudian dijalankan pada database SQL Server. Perhitungan yang dilakukan di luar kueri LINQ to SQL dijalankan dalam konteks CLR.

Misalnya, berikut ini adalah beberapa perbedaan perilaku antara CLR dan SQL Server:

  • SQL Server memesan beberapa jenis data secara berbeda dari jenis data yang setara di CLR. Misalnya, data SQL Server jenis UNIQUEIDENTIFIER diurutkan secara berbeda dari data CLR jenis System.Guid.

  • SQL Server menangani beberapa operasi perbandingan string secara berbeda dari CLR. Di SQL Server, perilaku perbandingan string tergantung pada pengaturan pemeriksaan di server. Untuk informasi selengkapnya, lihat Bekerja dengan Kolasi.

  • SQL Server dapat mengembalikan nilai yang berbeda untuk beberapa fungsi yang dipetakan daripada CLR. Misalnya, fungsi kesetaraan akan berbeda karena SQL Server menganggap dua string sama jika hanya berbeda dalam spasi tambahan; sedangkan CLR menganggap mereka tidak setara.

Pemetaan Enum

LINQ to SQL mendukung pemetaan jenis CLR System.Enum ke jenis SQL Server dalam dua cara:

  • Pemetaan ke jenis numerik SQL (TINYINT, SMALLINT, INT, BIGINT)

    Saat Anda memetakan jenis CLR System.Enum ke jenis numerik SQL, Anda memetakan nilai bilangan bulat yang mendasari CLR System.Enum ke nilai kolom database SQL Server. Misalnya, jika System.Enum bernama DaysOfWeek berisi anggota bernama Tue dengan nilai bilangan bulat dasar 3, anggota tersebut memetakan ke nilai database 3.

  • Memetakan ke jenis teks SQL (CHAR, NCHAR, VARCHAR, NVARCHAR)

    Saat Anda memetakan jenis CLR System.Enum ke jenis teks SQL, nilai database SQL dipetakan ke nama anggota CLR System.Enum. Misalnya, jika System.Enum bernama DaysOfWeek berisi anggota bernama Tue dengan nilai bilangan bulat dasar 3, anggota tersebut memetakan ke nilai database Tue.

Catatan

Saat memetakan jenis teks SQL ke CLR System.Enum, sertakan hanya nama anggota Enum di kolom SQL yang dipetakan. Nilai lain tidak didukung di kolom SQL yang dipetakan Enum.

Alat baris perintah O/R Designer dan SQLMetal tidak dapat secara otomatis memetakan jenis SQL ke kelas CLR Enum. Anda harus secara eksplisit mengonfigurasi pemetaan ini dengan menyesuaikan file DBML untuk digunakan oleh O/R Designer dan SQLMetal. Untuk informasi selengkapnya tentang pemetaan jenis khusus, lihat Pemetaan Jenis Khusus SQL-CLR.

Karena kolom SQL yang dimaksudkan untuk pencacahan akan memiliki jenis yang sama dengan kolom numerik dan teks lainnya; alat ini tidak akan mengenali niat dan default Anda untuk pemetaan seperti yang dijelaskan di bagian Pemetaan Numerik dan Pemetaan Teks dan XML berikut. Untuk informasi selengkapnya tentang membuat kode dengan file DBML, lihat Pembuatan Kode di LINQ to SQL.

Metode DataContext.CreateDatabase membuat kolom SQL jenis numerik untuk memetakan jenis CLR System.Enum.

Pemetaan Numerik

LINQ to SQL memungkinkan Anda memetakan banyak jenis numerik CLR dan SQL Server. Tabel berikut menunjukkan jenis CLR yang dipilih O/R Designer dan SQLMetal saat membuat model objek atau file pemetaan eksternal berdasarkan database Anda.

Jenis SQL Server Pemetaan Tipe CLR default yang digunakan oleh O/R Designer dan SQLMetal
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

Tabel berikutnya menunjukkan pemetaan jenis default yang digunakan oleh metode DataContext.CreateDatabase untuk menentukan jenis kolom SQL yang dibuat untuk dipetakan ke jenis CLR yang ditentukan dalam model objek atau file pemetaan eksternal.

Jenis CLR Jenis SQL Server default yang digunakan oleh 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

Ada banyak pemetaan numerik lain yang dapat Anda pilih, tetapi beberapa dapat mengakibatkan pengecualian kelebihan atau kehilangan data saat menerjemahkan ke atau dari database. Untuk informasi selengkapnya, lihat Matriks Perilaku Runtime Pemetaan Jenis.

Jenis Desimal dan Uang

Ketepatan default jenis SQL Server DECIMAL (18 digit desimal di kiri dan kanan titik desimal) jauh lebih kecil daripada presisi jenis CLR System.Decimal yang dipasangkan dengannya secara default. Hal ini dapat mengakibatkan hilangnya presisi saat Anda menyimpan data ke database. Namun, hal sebaliknya dapat terjadi jika jenis SQL Server DECIMAL dikonfigurasi dengan presisi lebih dari 29 digit. Jika jenis SQL Server DECIMAL telah dikonfigurasi dengan presisi yang lebih tinggi daripada CLR System.Decimal, kehilangan presisi dapat terjadi saat mengambil data dari database.

Jenis SQL Server MONEY dan SMALLMONEY, yang juga dipasangkan dengan jenis CLR System.Decimal secara default, memiliki presisi yang jauh lebih kecil, yang dapat mengakibatkan pengecualian luapan atau kehilangan data saat menyimpan data ke database.

Pemetaan Teks dan XML

Ada juga banyak jenis berbasis teks dan XML yang dapat Anda petakan dengan LINQ to SQL. Tabel berikut menunjukkan jenis CLR yang dipilih O/R Designer dan SQLMetal saat membuat model objek atau file pemetaan eksternal berdasarkan database Anda.

Jenis SQL Server Pemetaan Tipe CLR default yang digunakan oleh O/R Designer dan SQLMetal
CHAR System.String
NCHAR System.String
VARCHAR System.String
NVARCHAR System.String
TEXT System.String
NTEXT System.String
XML System.Xml.Linq.XElement

Tabel berikutnya menunjukkan pemetaan jenis default yang digunakan oleh metode DataContext.CreateDatabase untuk menentukan jenis kolom SQL yang dibuat untuk dipetakan ke jenis CLR yang ditentukan dalam model objek atau file pemetaan eksternal.

Jenis CLR Jenis SQL Server default yang digunakan oleh DataContext.CreateDatabase
System.Char NCHAR(1)
System.String NVARCHAR(4000)
System.Char[] NVARCHAR(4000)
Jenis khusus yang menerapkan Parse() dan ToString() NVARCHAR(MAX)

Ada banyak pemetaan berbasis teks dan XML lainnya yang dapat Anda pilih, tetapi beberapa dapat mengakibatkan pengecualian kelebihan atau kehilangan data saat menerjemahkan ke atau dari database. Untuk informasi selengkapnya, lihat Matriks Perilaku Runtime Pemetaan Jenis.

Jenis XML

Tipe data SQL Server XML tersedia mulai dari Microsoft SQL Server 2005. Anda dapat memetakan jenis data SQL Server XML ke XElement, XDocument, atau String. Jika kolom menyimpan fragmen XML yang tidak dapat dibaca ke dalam XElement, kolom harus dipetakan ke String untuk menghindari kesalahan runtime. Fragmen XML yang harus dipetakan ke String meliputi:

  • Urutan elemen XML

  • Atribut

  • Pengenal Publik (PI)

  • Komentar

Meskipun Anda dapat memetakan XElement dan XDocument ke SQL Server seperti yang ditunjukkan dalam Tipe Mapping Run Time Behavior Matrix, metode DataContext.CreateDatabase tidak memiliki pemetaan jenis SQL Server default untuk jenis ini.

Jenis Kustom

Jika kelas mengimplementasikan Parse() dan ToString(), Anda dapat memetakan objek ke semua jenis teks SQL (CHAR, NCHAR, VARCHAR, NVARCHAR, TEXT, NTEXT, XML ). Objek disimpan dalam database dengan mengirimkan nilai yang dikembalikan oleh ToString() ke kolom database yang dipetakan. Objek direkonstruksi dengan memanggil Parse() pada string yang dikembalikan oleh database.

Catatan

LINQ to SQL tidak mendukung serialisasi dengan menggunakan System.Xml.Serialization.IXmlSerializable.

Pemetaan Tanggal dan Waktu

Dengan LINQ to SQL, Anda dapat memetakan banyak jenis tanggal dan waktu SQL Server. Tabel berikut menunjukkan jenis CLR yang dipilih O/R Designer dan SQLMetal saat membuat model objek atau file pemetaan eksternal berdasarkan database Anda.

Jenis SQL Server Pemetaan Tipe CLR default yang digunakan oleh O/R Designer dan SQLMetal
SMALLDATETIME System.DateTime
DATETIME System.DateTime
DATETIME2 System.DateTime
DATETIMEOFFSET System.DateTimeOffset
DATE System.DateTime
TIME System.TimeSpan

Tabel berikutnya menunjukkan pemetaan jenis default yang digunakan oleh metode DataContext.CreateDatabase untuk menentukan jenis kolom SQL yang dibuat untuk dipetakan ke jenis CLR yang ditentukan dalam model objek atau file pemetaan eksternal.

Jenis CLR Jenis SQL Server default yang digunakan oleh DataContext.CreateDatabase
System.DateTime DATETIME
System.DateTimeOffset DATETIMEOFFSET
System.TimeSpan TIME

Ada banyak pemetaan tanggal dan waktu lain yang dapat Anda pilih, tetapi beberapa mungkin mengakibatkan pengecualian yang berlebihan atau kehilangan data saat menerjemahkan ke atau dari database. Untuk informasi selengkapnya, lihat Matriks Perilaku Runtime Pemetaan Jenis.

Catatan

Jenis SQL Server DATETIME2, DATETIMEOFFSET, DATE, dan TIME tersedia mulai dari Microsoft SQL Server 2008. LINQ to SQL mendukung pemetaan ke jenis baru ini yang dimulai dari .NET Framework versi 3.5 SP1.

Sistem.Tanggalwaktu

Rentang dan presisi jenis CLR System.DateTime lebih besar daripada rentang dan presisi jenis SQL Server DATETIME, yang merupakan pemetaan jenis default untuk metode DataContext.CreateDatabase. Untuk membantu menghindari pengecualian yang terkait dengan tanggal di luar rentang DATETIME, gunakan DATETIME2, yang tersedia mulai dari Microsoft SQL Server 2008. DATETIME2 dapat menyamai rentang dan presisi CLR System.DateTime.

Tanggal SQL Server tidak memiliki konsep TimeZone, fitur yang sangat didukung di CLR. Nilai TimeZone disimpan apa adanya ke database tanpa konversi TimeZone, terlepas dari informasi DateTimeKind asli. Saat nilai DateTime diambil dari database, nilainya dimuat apa adanya ke dalam DateTime dengan DateTimeKind dari Unspecified. Untuk informasi selengkapnya tentang metode System.DateTime yang didukung, lihat Metode System.DateTime.

System.TimeSpan

Microsoft SQL Server 2008 dan .NET Framework 3.5 SP1 memungkinkan Anda memetakan jenis CLR System.TimeSpan ke jenis SQL Server TIME. Namun, ada perbedaan besar antara rentang yang didukung CLR System.TimeSpan dan yang didukung oleh jenis SQL Server TIME. Memetakan nilai kurang dari 0 atau lebih besar dari 23:59:59.9999999 jam ke SQL TIME akan menghasilkan pengecualian yang berlebihan. Untuk informasi selengkapnya, lihat Metode System.TimeSpan.

Di Microsoft SQL Server 2000 dan SQL Server 2005, Anda tidak dapat memetakan bidang database ke TimeSpan. Namun, operasi pada TimeSpan didukung karena nilai TimeSpan dapat dikembalikan dari pengurangan DateTime atau dimasukkan ke dalam ekspresi sebagai variabel harfiah atau terikat.

Pemetaan Biner

Ada banyak jenis SQL Server yang bisa dipetakan ke jenis CLR System.Data.Linq.Binary. Tabel berikut menunjukkan jenis SQL Server yang menyebabkan O/R Designer dan SQLMetal menentukan jenis CLR System.Data.Linq.Binary saat membuat model objek atau file pemetaan eksternal berdasarkan database Anda.

Jenis SQL Server Pemetaan Tipe CLR default yang digunakan oleh O/R Designer dan SQLMetal
BINARY(50) System.Data.Linq.Binary
VARBINARY(50) System.Data.Linq.Binary
VARBINARY(MAX) System.Data.Linq.Binary
VARBINARY(MAX) dengan atribut FILESTREAM System.Data.Linq.Binary
IMAGE System.Data.Linq.Binary
TIMESTAMP System.Data.Linq.Binary

Tabel berikutnya menunjukkan pemetaan jenis default yang digunakan oleh metode DataContext.CreateDatabase untuk menentukan jenis kolom SQL yang dibuat untuk dipetakan ke jenis CLR yang ditentukan dalam model objek atau file pemetaan eksternal.

Jenis CLR Jenis SQL Server default yang digunakan oleh DataContext.CreateDatabase
System.Data.Linq.Binary VARBINARY(MAX)
System.Byte VARBINARY(MAX)
System.Runtime.Serialization.ISerializable VARBINARY(MAX)

Ada banyak pemetaan biner lain yang dapat Anda pilih, tetapi beberapa mungkin menghasilkan pengecualian yang berlebihan atau kehilangan data saat menerjemahkan ke atau dari database. Untuk informasi selengkapnya, lihat Matriks Perilaku Runtime Pemetaan Jenis.

SQL Server FILESTREAM

Atribut FILESTREAM untuk VARBINARY(MAX) kolom tersedia mulai dari Microsoft SQL Server 2008; Anda dapat memetakannya dengan LINQ to SQL yang dimulai dengan .NET Framework versi 3.5 SP1.

Meskipun Anda dapat memetakan VARBINARY(MAX) kolom dengan atribut FILESTREAM ke objek Binary, metode DataContext.CreateDatabase tidak dapat membuat kolom dengan atribut FILESTREAM secara otomatis. Untuk informasi selengkapnya tentang FILESTREAM, lihat Ikhtisar FILESTREAM.

Serialisasi Biner

Jika kelas mengimplementasikan antarmuka ISerializable, Anda dapat membuat serial objek ke bidang biner SQL apa pun (BINARY, VARBINARY, IMAGE). Objek diserialisasi dan dideserialisasi sesuai dengan cara antarmuka ISerializable diimplementasikan. Untuk informasi selengkapnya, lihat Serialisasi Biner.

Pemetaan Lain-Lain

Tabel berikut menunjukkan pemetaan jenis default untuk beberapa jenis lain-lain yang belum disebutkan. Tabel berikut menunjukkan jenis CLR yang dipilih O/R Designer dan SQLMetal saat membuat model objek atau file pemetaan eksternal berdasarkan database Anda.

Jenis SQL Server Pemetaan Tipe CLR default yang digunakan oleh O/R Designer dan SQLMetal
UNIQUEIDENTIFIER System.Guid
SQL_VARIANT System.Object

Tabel berikutnya menunjukkan pemetaan jenis default yang digunakan oleh metode DataContext.CreateDatabase untuk menentukan jenis kolom SQL yang dibuat untuk dipetakan ke jenis CLR yang ditentukan dalam model objek atau file pemetaan eksternal.

Jenis CLR Jenis SQL Server default yang digunakan oleh DataContext.CreateDatabase
System.Guid UNIQUEIDENTIFIER
System.Object SQL_VARIANT

LINQ to SQL tidak mendukung pemetaan jenis lain untuk jenis lain-lain ini. Untuk informasi selengkapnya, lihat Matriks Perilaku Runtime Pemetaan Jenis.

Lihat juga