डेटाटाइम के डेटा प्रकार में डेटाइम 2 प्रकार के रूपांतरण के परिणामस्वरूप आउट-ऑफ-द-रेंज मान होता है


174

मेरा होमकंट्रोलर में निम्नलिखित कोड है:

public ActionResult Edit(int id)
{
    var ArticleToEdit = (from m in _db.ArticleSet where m.storyId == id select m).First();
    return View(ArticleToEdit);
}

[ValidateInput(false)]
[AcceptVerbs(HttpVerbs.Post)]
public ActionResult Edit(Article ArticleToEdit)
{
    var originalArticle = (from m in _db.ArticleSet where m.storyId == ArticleToEdit.storyId select m).First();
    if (!ModelState.IsValid)
        return View(originalArticle);

    _db.ApplyPropertyChanges(originalArticle.EntityKey.EntitySetName, ArticleToEdit);
    _db.SaveChanges();
    return RedirectToAction("Index");
}

और यह संपादन विधि के लिए दृश्य है:

<% using (Html.BeginForm()) {%>

    <fieldset>
        <legend>Fields</legend>
        <p>
            <label for="headline">Headline</label>
            <%= Html.TextBox("headline") %>
        </p>
        <p>
            <label for="story">Story <span>( HTML Allowed )</span></label>
            <%= Html.TextArea("story") %>
        </p>
        <p>
            <label for="image">Image URL</label>
            <%= Html.TextBox("image") %>
        </p>
        <p>
            <input type="submit" value="Post" />
        </p>
    </fieldset>

<% } %>

जब मैं सबमिट बटन दबाता हूं तो मुझे त्रुटि मिलती है: {"The conversion of a datetime2 data type to a datetime data type resulted in an out-of-range value.\r\nThe statement has been terminated."}कोई भी विचार समस्या क्या है? मैं मान रहा हूं कि संपादित विधि DB में पोस्ट किए गए मान को संपादित करने के लिए अपडेट करने की कोशिश कर रही है, लेकिन किसी कारण से यह इसे पसंद नहीं कर रहा है ... हालांकि मैं यह नहीं देखता कि तारीख क्यों शामिल है क्योंकि इसमें उल्लेख नहीं किया गया है संपादित करने के लिए नियंत्रक विधि?


1
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
एंथनी निकोल्स

जवाबों:


166

मुद्दा यह है कि आप ApplyPropertyChangesएक मॉडल ऑब्जेक्ट के साथ उपयोग कर रहे हैं जो केवल फॉर्म (शीर्षक, कहानी और छवि) में डेटा के साथ आबादी है। ApplyPropertyChangesऑब्जेक्ट के सभी गुणों पर परिवर्तन लागू करता है, जिसमें आपका DateTimeअसंवैधानिक शामिल है, जो 0001-01-01 को सेट किया गया है, जो SQL सर्वर की सीमा के बाहर है DATETIME

उपयोग करने के बजाय ApplyPropertyChanges, मैं सुझाव दूंगा कि वस्तु को संशोधित किया जा रहा है, अपने प्रपत्र संपादन के विशिष्ट क्षेत्रों को बदलें, फिर उन संशोधनों के साथ वस्तु को बचाएं; इस तरह, केवल परिवर्तित फ़ील्ड संशोधित किए गए हैं। वैकल्पिक रूप से, आप अपने पृष्ठ में छिपे हुए इनपुट को अन्य क्षेत्रों में आबादी वाले क्षेत्रों में रख सकते हैं, लेकिन यह समवर्ती संपादन के साथ बहुत अनुकूल नहीं होगा।

अपडेट करें:

यहां आपकी वस्तु के कुछ क्षेत्रों को अपडेट करने का एक अप्रयुक्त नमूना है (यह मानकर आप LINQ से SQL का उपयोग कर रहे हैं):

var story = _db.ArticleSet.First(a => a.storyId == ArticleToEdit.storyId);
story.headline = ArticleToEdit.headline;
story.story = ArticleToEdit.story;
story.image = ArticleToEdit.image;
story.modifiedDate = DateTime.Now;
_db.SubmitChanges();

बहुत उपयोगी :) मैं सोच रहा था कि जब मैंने इसे निर्दिष्ट नहीं किया था, तो तारीख को क्यों बदला जा रहा था। क्या आप संपादन विधि को बदलने में मदद कर सकते हैं तो यह अब ApplyPropertyChanges का उपयोग नहीं करता है? जैसा कि मैं ASP.NET के लिए नया हूँ और इस समय इसे पूरी तरह से नहीं समझता हूँ। धन्यवाद मित्र।
कैमरून

क्या होगा यदि मैं दिनांक को वर्तमान तिथि पर सेट करना चाहता / चाहती हूँ। लेख अद्यतन किया गया है कि डेटाटाइम? जैसा कि शायद यह सबसे अच्छा विकल्प होने वाला है और मुझे लगता है कि यह ApplyPropertyChanges के साथ काम करेगा जो मेरे पास है।
कैमरन

मेरा संपादन देखें (यह मानता है कि यह modifiedDateआपकी संपत्ति का नाम है)
याकूब

SubmitChanges मेरे ऐप में काम नहीं करता है: / क्या story.modifiedDate = DateTime.Now;मेरे वर्तमान कोड में बिट जोड़ना संभव है ? साभार
कैमरन

1
यह त्रुटि तब होती है जब हम सार्वजनिक DateTime को सार्वजनिक DateTime के स्थान पर सेट करते हैं? CreatedDate, क्योंकि डेटटाइम शून्य नहीं हो सकता है, इसलिए इसकी सीमा से बाहर त्रुटि क्यों है। यह मददगार हो सकता है, लेकिन इसने मेरी समस्या हल कर दी।
अदनान

115

एंटिटी फ्रेमवर्क का उपयोग करते समय लोग एक सामान्य त्रुटि का सामना करते हैं। यह तब होता है जब सेव की गई तालिका से जुड़ी इकाई में एक अनिवार्य डेटाइम फ़ील्ड होता है और आप इसे कुछ मान से सेट नहीं करते हैं।

डिफ़ॉल्ट डेटाइम ऑब्जेक्ट को मान के साथ बनाया गया है 01/01/1000और इसे null के स्थान पर उपयोग किया जाएगा। यह डेटाइम कॉलम पर भेजा जाएगा जो 1753-01-01 00:00:00आगे से दिनांक मान रख सकता है , लेकिन पहले नहीं, आउट-ऑफ-रेंज अपवाद के लिए अग्रणी।

इस त्रुटि को हल करने के लिए या तो डेटाबेस क्षेत्र को संशोधित करने के लिए शून्य मान या फ़ील्ड को मान के साथ प्रारंभ करके हल किया जा सकता है।


3
ऐसा तब होता है जब डेटाबेस में डेटाइम क्षेत्र वैकल्पिक होता है और मान सेट नहीं होता है। इसके लिए यह आम लोगों की त्रुटि नहीं है कि यह ईएफ वास्तु मुद्दों में से एक है।
GSoft परामर्श

1
मैं सहमत हूं कि ईएफ को डीबी में प्रकार देखना चाहिए और तदनुसार समायोजित करना चाहिए या कम से कम एक अधिक सटीक त्रुटि फेंकना या फेंकना चाहिए। उल्टा, मुझे आपका जवाब पसंद है क्योंकि आपने सामान्य एक के बजाय 2 विकल्प प्रदान किए - फाइल को मिनिमम वैल्यू के साथ आरंभ करें।
दांते .स्मिथ २४'१m

43

DATETIME1753/1/1 से "अनंत काल" (9999/12/31) का DATETIME2समर्थन करता है , जबकि 0001/1/1 से अनंत काल तक समर्थन करता है।

MSDN

उत्तर: मुझे लगता है कि आप DateTime'0001/1/1' मान के साथ बचत करने का प्रयास करते हैं । बस ब्रेकपॉइंट सेट करें और इसे डीबग करें, यदि ऐसा है तो सामान्य दिनांक के DateTimeसाथ बदलें nullया सेट करें।


हालांकि मैं नियंत्रक में क्या डाल सकता हूँ? डीबग करना बस उस त्रुटि को लाता है जिसे मैंने ऊपर पोस्ट किया है। धन्यवाद।
कैमरन

यहाँ त्रुटि प्रतीत होती है -> _db.SaveChanges (); आप इस लाइन से पहले ब्रेकपॉइंट सेट कर सकते हैं ...
एंड्रयू ऑरसिच

हाँ कर दिया। तब यह कहता है कि यह SaveChanges पर एक त्रुटि है इसलिए मैं इनर एक्सेप्शन को देखता हूं और यह कहता है कि पोस्ट की गई त्रुटि के कारण यह त्रुटि है!
कैमरून

क्या आपने _db.SaveChanges () से पहले DateTime मान की जाँच की; बुलाया गया था? यह '1753/1/1' की तुलना में शानदार है।
एंड्रयू ओरिस

मूलआर्टिकल दिनांक मान {18/10/2009 00:00:00} और ArticleToEdit तिथि मान {01/01/0001 00:00:00} है, इसलिए ऐसा लगता है कि यह तारीख से उन सभी चीज़ों में से 1 को बदलने की कोशिश कर रहा है जो isn है मैं नहीं चाहता, लेकिन यह समझाता हूं कि यह त्रुटि क्यों फेंक रहा है क्योंकि प्रारूप समान अधिकार है?
कैमरून

14

यह एक मुझे पागल कर रहा था। मैं एक अशक्त दिनांक समय ( DateTime?) का उपयोग करने से बचना चाहता था । मेरे पास SQL ​​2008 के datetime2 प्रकार का उपयोग करने का विकल्प नहीं था ( modelBuilder.Entity<MyEntity>().Property(e => e.MyDateColumn).HasColumnType("datetime2");)।

मैंने अंततः निम्नलिखित का विकल्प चुना:

public class MyDb : DbContext
{
    public override int SaveChanges()
    {
        UpdateDates();
        return base.SaveChanges();
    }

    private void UpdateDates()
    {
        foreach (var change in ChangeTracker.Entries<MyEntityBaseClass>())
        {
            var values = change.CurrentValues;
            foreach (var name in values.PropertyNames)
            {
                var value = values[name];
                if (value is DateTime)
                {
                    var date = (DateTime)value;
                    if (date < SqlDateTime.MinValue.Value)
                    {
                        values[name] = SqlDateTime.MinValue.Value;
                    }
                    else if (date > SqlDateTime.MaxValue.Value)
                    {
                        values[name] = SqlDateTime.MaxValue.Value;
                    }
                }
            }
        }
    }
}

10

आप इस समस्या को मॉडल (इकाई फ्रेमवर्क संस्करण> = 5) में जोड़कर भी ठीक कर सकते हैं

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime CreationDate { get; set; }

8

यदि आपके पास एक स्तंभ है जो डेटाइम है और अशक्त है तो आपको यह त्रुटि मिलेगी। मैं पहले वस्तु को पास करने के लिए एक मूल्य निर्धारित करने की सलाह देता हूं। सेवेचेगेस ();


5

मेरे द्वारा अपना मॉडल (कोड प्रथम) बदलने के बाद मुझे यह त्रुटि मिली:

public DateTime? DateCreated

सेवा

public DateTime DateCreated

DateCreated में अशक्त-मूल्य वाली वर्तमान पंक्तियों ने इस त्रुटि का कारण बना। इसलिए मुझे मानक मान के साथ फ़ील्ड को इनिशियलाइज़ करने के लिए मैन्युअल रूप से SQL UPDATE स्टेटमेंट का उपयोग करना पड़ा ।

एक अन्य समाधान दायर के लिए डिफ़ॉल्ट मूल्य का एक विवरण हो सकता है।


3

मेरे मामले में, डेटाबेस की तालिका में मैं जिस कक्षा का उपयोग कर रहा था, उसके शुरुआती चरण में, मैं अपनी डेटटाइम प्रॉपर्टी के लिए कोई डिफ़ॉल्ट मान सेट नहीं कर रहा था, इसलिए समस्या का परिणाम @Andrew Orsich 'उत्तर में बताया गया। इसलिए मैंने बस संपत्ति को अशक्त बना दिया। या मैं इसे DateTime.Now कंस्ट्रक्टर में भी दे सकता था। आशा है कि यह किसी की मदद करता है।


3

ऐसा लगता है कि आप इकाई ढांचे का उपयोग कर रहे हैं। मेरा समाधान सभी डेटाटाइम कॉलमों को डेटाटाइम 2 पर स्विच करना था, और किसी भी नए कॉलम के लिए डेटाटाइम 2 का उपयोग करना था, दूसरे शब्दों में डिफ़ॉल्ट रूप से ईएफ का उपयोग करें डेटटाइम 2। इसे अपने संदर्भ में OnModelCreating विधि में जोड़ें:

modelBuilder.Properties<DateTime>().Configure(c => c.HasColumnType("datetime2"));

कि सभी DateTime और DateTime मिलेंगे? आपके मॉडल में सभी संस्थाओं पर गुण।


2

मेरे पास एक ही समस्या थी, दुर्भाग्य से, मेरे मॉडल पर दो डेटटाइम प्रॉपर्टी है और एक डेटटाइम प्रॉपर्टी है जो मैं सेविंगहैंज करने से पहले अशक्त हूं।

इसलिए सुनिश्चित करें कि परिवर्तनों को सहेजने से पहले अपने मॉडल का दिनांक समय मान है या त्रुटि को रोकने के लिए इसे अशक्त बना सकते हैं:

public DateTime DateAdded { get; set; }   //This DateTime always has a value before persisting to the database.
public DateTime ReleaseDate { get; set; }  //I forgot that this property doesn't have to have DateTime, so it will trigger an error

इसलिए यह मेरी समस्या को हल करता है, यह सुनिश्चित करने की बात है कि डेटाबेस से पहले आपका मॉडल दिनांक सही है:

public DateTime DateAdded { get; set; }
public DateTime? ReleaseDate { get; set; }

2

यदि आप Entity फ्रेमवर्क संस्करण> = 5 का उपयोग कर रहे हैं, तो [DatabaseGenerated (DatabaseGeneratedOption.Computed)] को अपनी कक्षा के डेटटाइम गुणों के लिए एनोटेशन लागू करने से डेटाबेस तालिका के ट्रिगर को रिकॉर्ड बनाने और रिकॉर्ड अपडेट करने की तारीखों को अपना काम करने की अनुमति मिल जाएगी। आपके एंटिटी फ्रेमवर्क कोड को गैग करना।

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateCreated { get; set; }

[DatabaseGenerated(DatabaseGeneratedOption.Computed)]
public DateTime DateUpdated { get; set; }

यह 6 वें उत्तर के समान है, जो डोंगोलो जेनो द्वारा लिखित और गिले क्यू द्वारा संपादित किया गया है।


1

इसके अलावा, अगर आपको कोड का हिस्सा नहीं पता है, जहां त्रुटि हुई, तो आप mssql को एकीकृत एसक्यूएल प्रोफाइलर का उपयोग करके "खराब" एसक्यूएल निष्पादन को प्रोफाइल कर सकते हैं।

खराब डेटाटाइम परम कुछ इस तरह प्रदर्शित होगा:

बुरा परम


1

यह समस्या आमतौर पर तब होती है जब आप किसी इकाई को अपडेट करने का प्रयास कर रहे होते हैं। उदाहरण के लिए, आपके पास एक इकाई है जिसमें एक फ़ील्ड होता है जिसे कहा जाता DateCreatedहै [आवश्यक] और जब आप रिकॉर्ड सम्मिलित करते हैं, तो कोई त्रुटि नहीं दी जाती है, लेकिन जब आप उस विशेष इकाई को अपडेट करना चाहते हैं, तो आपको प्राप्त होता है

डेटाटाइम 2 त्रुटि सीमा से बाहर रूपांतरण।

अब यहाँ समाधान है:

आपके संपादन दृश्य पर, यानी edit.cshtmlMVC उपयोगकर्ताओं के लिए, आपको DateCreatedबस अपने संपादन क्षेत्र के प्राथमिक कुंजी के लिए छिपे हुए फ़ील्ड के नीचे एक छुपा फ़ॉर्म फ़ील्ड जोड़ना होगा ।

उदाहरण:

@Html.HiddenFor(model => model.DateCreated)

इसे अपने संपादन दृश्य में शामिल करने से, आपको वह त्रुटि कभी नहीं होगी जो मैं आपको आश्वस्त करता हूं।


1

आपको अपनी तिथि चर के लिए शून्य मान सक्षम करना होगा:

 public Nullable<DateTime> MyDate{ get; set; }

0

अपनी संपत्ति को अशक्त बनाने का प्रयास करें।

    public DateTime? Time{ get; set; }

मेरे लिए काम किया।


0

यदि आप DB तक पहुँच प्राप्त करते हैं, तो आप DB स्तंभ प्रकार को डेटाइमटाइम से datetime2 (7) में बदल सकते हैं, यह अभी भी एक डेटाइम ऑब्जेक्ट भेजेगा और इसे सहेजा जाएगा


0

मॉडल में अशक्त डेटाटाइम होना चाहिए। ऑब्जेक्ट को पुनर्प्राप्त करने के पहले सुझाए गए तरीके को संशोधित किया जाना चाहिए जो कि ApplyPropertyChanges के बजाय उपयोग किया जाना चाहिए। मेरे मामले में मेरे पास अपनी वस्तु को बचाने के लिए यह विधि थी:

public ActionResult Save(QCFeedbackViewModel item)

और फिर सेवा में, मैं उपयोग करके पुनः प्राप्त करता हूं:

RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null 

सेवा का पूरा कोड नीचे दिया गया है:

 var add = new QC_LOG_FEEDBACK()
            {

                QCLOG_ID = item.QCLOG_ID,
                PRE_QC_FEEDBACK = item.PRE_QC_FEEDBACK,
                RETURNED = item.RETURNED.HasValue ? Convert.ToDateTime(item.RETURNED) : (DateTime?)null,
                PRE_QC_RETURN = item.PRE_QC_RETURN.HasValue ? Convert.ToDateTime(item.PRE_QC_RETURN) : (DateTime?)null,
                FEEDBACK_APPROVED = item.FEEDBACK_APPROVED,
                QC_COMMENTS = item.QC_COMMENTS,
                FEEDBACK = item.FEEDBACK
            };

            _context.QC_LOG_FEEDBACK.Add(add);
            _context.SaveChanges();

0

[हल] इकाई ढांचा संहिता में पहले (मेरा मामला) सिर्फ मेरी समस्या DateTimeको DateTime?हल करने के लिए बदल रहा है।

/*from*/ public DateTime SubmitDate { get; set; }
/*to  */ public DateTime? SubmitDate { get; set; }

0

त्रुटि: डेटाटाइम के डेटा प्रकार में डेटाइम 2 डेटा के रूपांतरण के परिणामस्वरूप आउट-ऑफ-द-रेंज मान होता है।

यह त्रुटि तब हुई जब EF का उपयोग करते हुए SQL DB में एक NULL डेट कॉलम के खिलाफ कोई मान असाइन नहीं करने के कारण और उसी को असाइन करके हल किया गया था।

उम्मीद है की यह मदद करेगा!


0

डेटाबेस प्रथम दृष्टिकोण से मेरी कक्षाएं बनाते समय इस समस्या को समझें। केवल Convert.DateTime (dateCausingProblem) का उपयोग करके हल किया गया है। वास्तव में, हमेशा पास होने से पहले मूल्यों को बदलने की कोशिश करें, यह आपको अप्रत्याशित मूल्यों से बचाता है।


0

आपको अपने दिनांक फ़ील्ड के इनपुट प्रारूप को आवश्यक इकाई प्रारूप से मेल खाना होगा जो कि yyyy / mm / dd है


1
अन्य उत्तर हैं जो ओपी के प्रश्न प्रदान करते हैं, और वे कुछ समय पहले पोस्ट किए गए थे। उत्तर पोस्ट करते समय देखें: मैं एक अच्छा उत्तर कैसे लिखूं? , कृपया सुनिश्चित करें कि आप या तो एक नया समाधान जोड़ सकते हैं, या काफी बेहतर स्पष्टीकरण, विशेष रूप से पुराने प्रश्नों का उत्तर देते समय।
help-info.de
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.