Saya memiliki data dengan 5 kolom, di mana baris diisi dengan data kemudian disimpan ke database melalui transaksi.
Saat menyimpan, kesalahan dikembalikan:
Konversi tipe data datetime2 ke tipe data datetime menghasilkan nilai di luar kisaran
Ini menyiratkan, sebagaimana telah dibaca, bahwa data saya memiliki tipe DateTime2
dan database saya a DateTime
; itu salah.
Kolom tanggal disetel DateTime
seperti ini:
new DataColumn("myDate", Type.GetType("System.DateTime"))
Pertanyaan
Apakah ini dapat diselesaikan dalam kode atau apakah ada sesuatu yang harus diubah pada tingkat database?
sumber
Ini bisa terjadi jika Anda tidak menetapkan nilai ke bidang DateTime ketika bidang tidak menerima nilai NULL .
Itu memperbaikinya bagi saya!
sumber
Baik peta
DATETIME
dan dalam. NET - Anda tidak dapat benar-benar melakukan "konversi", karena benar-benar jenis .NET yang sama.DATETIME2
System.DateTime
Lihat halaman dokumen MSDN: http://msdn.microsoft.com/en-us/library/bb675168.aspx
Ada dua nilai berbeda untuk "
SqlDbType
" untuk keduanya - dapatkah Anda menentukannya dalamDataColumn
definisi Anda ?TETAPI: di SQL Server, rentang tanggal yang didukung sangat berbeda.
DATETIME
mendukung 1753/1/1 hingga "keabadian" (9999/12/31), sementaraDATETIME2
mendukung 0001/1/1 hingga keabadian.Jadi apa yang benar-benar perlu Anda lakukan adalah memeriksa tahun tanggal - jika sebelum 1753, Anda perlu mengubahnya menjadi sesuatu SETELAH 1753 agar
DATETIME
kolom di SQL Server untuk menanganinya.Marc
sumber
DtInit = new System.DateTime(1492, 10, 12),
gagalDalam database SQL Server 2008 saya, saya memiliki
DateTime
kolom yang ditandai sebagai tidak dapat dibatalkan, tetapi denganGetDate()
fungsi sebagai nilai default. Ketika menyisipkan objek baru menggunakan EF4, saya mendapatkan kesalahan ini karena saya tidak meneruskan properti DateTime pada objek saya secara eksplisit. Saya mengharapkan fungsi SQL untuk menangani tanggal untuk saya tetapi tidak. Solusi saya adalah mengirim nilai tanggal dari kode alih-alih mengandalkan database untuk menghasilkannya.sumber
Nullable<DateTime>
, dan dalam kode saya dapat membiarkan ini benar-benar nol (bukan 01/01/0000). Saya terkejut melihat bahwa EF to SQL tahu untuk mengabaikan null ini pada INSERT dan menggunakan tanggal dari server (GetDate()
) ... Bagi kami ini bahkan lebih baik karena kami membutuhkan konsistensi yang lebih baik pada server, tanpa khawatir tentang perbedaan jam antara server web dan server sql.bagi saya itu karena datetime itu ..
dalam hal ini Anda ingin menetapkan nol untuk Anda EF DateTime Object ... menggunakan kode FirstYearRegistered saya sebagai contoh
sumber
Yang ini membuatku gila. Saya ingin menghindari menggunakan waktu tanggal nullable (
DateTime?
). Saya juga tidak memiliki opsi untuk menggunakandatetime2
tipe SQL Server 2008Saya akhirnya memilih yang berikut:
sumber
[Column(TypeName = "datetime2")]
?Terkadang EF tidak tahu yang berurusan dengan kolom yang dikomputasi atau pemicu . Sesuai desain, operasi tersebut akan menetapkan nilai di luar EF setelah disisipkan.
Cara mengatasinya adalah menentukan
Computed
di EFedmx
untuk kolom itu diStoreGeneratedPattern
properti.Bagi saya ketika kolom memiliki pemicu yang memasukkan tanggal dan waktu saat ini, lihat di bawah di bagian ketiga.
Langkah-langkah Untuk Menyelesaikan
Dalam Visual Studio buka
Model Browser
halamanModel
laluEntity Types
-> laluStoreGeneratedPattern
Computed
Untuk situasi ini, jawaban lain adalah solusi, untuk tujuan kolom adalah untuk memiliki waktu / tanggal yang ditentukan ketika catatan dibuat, dan itu adalah tugas SQL untuk menjalankan pemicu untuk menambah waktu yang tepat. Seperti pemicu SQL ini:
DEFAULT (GETDATE()) FOR [DateCreated]
.sumber
GETDATE()
yang saya benar-benar lakukan pada saat itu. Tapi ada komentar baru-baru ini yang harus digunakanSYSDATETIME()
untuk operasi DateTime2 yang saya yakini benar.Saya mengalami ini dan menambahkan berikut ini ke properti datetime saya:
sumber
using System.ComponentModel.DataAnnotations.Schema;
diperlukanJika kami tidak melewatkan waktu tanggal ke bidang waktu tanggal, tanggal default {1/1/0001 12:00:00 AM} akan diteruskan.
Tetapi tanggal ini tidak kompatibel dengan kerangka kerja entitas sehingga akan dibuang konversi tipe data datetime2 ke tipe data datetime menghasilkan nilai di luar rentang
Hanya
default DateTime.now
ke bidang tanggal jika Anda tidak melewatkan tanggal apa pun.sumber
Hal termudah adalah mengubah database Anda untuk menggunakan datetime2 daripada datetime. Kompatibilitas berfungsi dengan baik, dan Anda tidak akan mendapatkan kesalahan.
Anda masih ingin melakukan banyak pengujian ...
Kesalahannya mungkin karena Anda mencoba menetapkan tanggal ke tahun 0 atau sesuatu - tetapi semuanya tergantung pada di mana Anda memiliki kendali untuk mengubah barang.
sumber
Saya menemukan posting ini mencoba mencari tahu mengapa saya terus mendapatkan kesalahan berikut yang dijelaskan oleh jawaban lain.
Konversi tipe data datetime2 ke tipe data datetime menghasilkan nilai di luar kisaran.
Gunakan objek DateTime yang dapat dibatalkan.
DateTime publik? PurchaseDate {get; set; }
Jika Anda menggunakan kerangka kerja, atur properti nullable di file edmx ke True
sumber
Seperti yang telah ditunjukkan oleh andyuk , ini bisa terjadi ketika nilai NULL ditetapkan ke bidang DateTime yang tidak dapat dibatalkan . Pertimbangkan untuk mengubah DateTime ke DateTime? atau Nullable < DateTime >. Ingatlah bahwa, jika Anda menggunakan Properti Ketergantungan , juga harus memastikan bahwa tipe properti dependensi Anda juga merupakan tipe DateTime yang dapat dibatalkan.
Di bawah ini adalah contoh kehidupan nyata dari DateTime ke DateTime yang tidak lengkap ? penyesuaian tipe yang memunculkan perilaku aneh
sumber
Entity Framework 4 berfungsi dengan tipe data datetime2 sehingga dalam db bidang terkait harus datetime2 untuk SQL Server 2008.
Untuk mencapai solusi ada dua cara.
sumber
Menciptakan kelas dasar berdasarkan implementasi @ sky-dev. Jadi ini dapat dengan mudah diterapkan ke berbagai konteks, dan entitas.
Pemakaian:
sumber
Tambahkan atribut yang disebutkan di bawah pada properti di kelas model Anda.
Awalnya saya lupa menambahkan atribut ini. Jadi dalam database saya kendala dibuat seperti
dan saya menambahkan atribut ini dan memperbarui db saya kemudian diubah menjadi
sumber
Dalam kasus saya, kami memberikan Tanggal ke Tanggal dan kami mendapat kesalahan ini. Apa yang terjadi adalah bahwa Date memiliki minimum "lebih berorientasi programmer" 01/01/0001, sedangkan Datetime macet pada 1753
Gabungkan itu dengan kesalahan pengumpulan data di pihak kami, dan Anda mendapatkan pengecualian!
sumber
Terkadang ini berfungsi dengan baik pada mesin pengembangan dan tidak di server. Dalam kasus saya, saya harus mengatakan:
Di file web.config.
Zona waktu di mesin (Server) benar (ke lokasi CO) tetapi aplikasi web tidak. Pengaturan ini dilakukan dan berfungsi dengan baik lagi.
Tentu saja, semua tanggal memiliki nilai.
: D
sumber
Menambahkan kode ini ke kelas di ASP.NET bekerja sama dengan saya:
sumber
Saya menyadari masalah ini dan Anda semua seharusnya juga:
https://en.wikipedia.org/wiki/Year_2038_problem
Dalam SQL tipe bidang baru dibuat untuk menghindari masalah ini (datetime2).
Jenis bidang 'Tanggal' ini memiliki nilai rentang yang sama dengan kelas .Net DateTime. Ini akan menyelesaikan semua masalah Anda, jadi saya pikir cara terbaik untuk menyelesaikannya adalah mengubah jenis kolom basis data Anda (itu tidak akan mempengaruhi data tabel Anda).
sumber
Periksa dua berikut: 1) Bidang ini tidak memiliki nilai NULL. Sebagai contoh:
Ganti ke:
2) Baru database lagi. Sebagai contoh:
sumber
Masalah dengan atribut datetime yang diwarisi
Pesan kesalahan ini sering ditampilkan ketika bidang tanggal yang tidak dapat dibatalkan memiliki nilai nol pada waktu memasukkan / memperbarui. Salah satu penyebabnya adalah warisan.
Jika tanggal Anda diwariskan dari kelas dasar dan Anda tidak membuat pemetaan, EF tidak akan membaca nilainya.
Untuk informasi lebih lanjut: https://weblogs.asp.net/manavi/inheritance-mapping-strategies-with-entity-framework-code-first-ctp5-part-3-table-per-concrete-type-tpc-and- memilih-strategi-pedoman
sumber
Saya melihat kesalahan ini ketika saya ingin mengedit halaman menggunakan ASP.Net MVC. Saya tidak punya masalah saat Membuat tetapi Memutakhirkan Database membuat properti DateCreated saya di luar jangkauan!
Ketika Anda tidak ingin
DateTime
Properti Anda dapat dibatalkan dan tidak ingin memeriksa apakah nilainya ada dalam rentang DateTime sql (dan@Html.HiddenFor
tidak membantu!), Cukup tambahkanstatic DateTime
bidang di dalam kelas terkait (Pengontrol) dan berikan nilai saat GET sedang beroperasi kemudian gunakan ketika POST melakukan tugasnya:sumber
Saya mengalami masalah ini pada proyek aplikasi konsol sederhana dan solusi cepat saya adalah mengubah setiap tanggal datetime2 yang mungkin menjadi datetime nullable dengan menjalankan metode ini:
Ini jelas bukan metode yang sepenuhnya komprehensif, tetapi ini bekerja untuk kebutuhan saya dan mungkin itu akan membantu orang lain!
sumber
Periksa format req dalam DB. misalnya DB saya memiliki nilai Default atau Binding
(((1)/(1))/(1900))
sumber
Anda akan memiliki kolom tanggal yang ditetapkan untuk lesathan nilai min dattime yang diizinkan seperti 1/1/1001.
untuk mengatasi masalah ini Anda dapat mengatur nilai datetime yang tepat untuk properti Anda dan juga mengatur properti ajaib lainnya seperti IsSpecified = true.
sumber