একটি ডেটটাইম 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."}সমস্যাটি কোনও ধারণা? আমি ধরে নিচ্ছি যে সম্পাদনা পদ্ধতিটি ডিবিতে পোস্ট করা মানটিকে সম্পাদিতের সাথে আপডেট করার চেষ্টা করছে তবে কোনও কারণে এটি পছন্দ করছে না ... যদিও তারিখটি উল্লিখিত হয়নি বলে আমি কেন দেখিনা সম্পাদনার জন্য নিয়ামক পদ্ধতি?


1
modelBuilder.Entity<WorldInfo>().Property(d => d.CurrentTime).HasColumnType("datetime2");
অ্যান্টনি নিকলস

উত্তর:


166

সমস্যাটি হ'ল আপনি এমন ApplyPropertyChangesএকটি মডেল অবজেক্ট ব্যবহার করছেন যা কেবলমাত্র ফর্মের ডেটা (শিরোনাম, গল্প এবং চিত্র) দিয়ে পপুলেশন করা হয়েছে। ApplyPropertyChangesআপনার DateTimeঅবিচ্ছিন্নকরণ সহ, যা এসকিউএল সার্ভারের ব্যাপ্তির বাইরে নয়, এটি 0001-01-01 এ সেট করা সহ, অবজেক্টের সমস্ত বৈশিষ্ট্যের পরিবর্তনের জন্য প্রয়োগ করে DATETIME

ব্যবহার করার পরিবর্তে ApplyPropertyChanges, আমি অবজেক্টটি সংশোধন করা হচ্ছে পুনরুদ্ধার করার পরামর্শ দেব, আপনার ফর্ম সম্পাদনা করা নির্দিষ্ট ক্ষেত্রগুলি পরিবর্তন করুন এবং তারপরে সেই পরিবর্তনগুলি দিয়ে অবজেক্টটি সংরক্ষণ করুন; এইভাবে, শুধুমাত্র পরিবর্তিত ক্ষেত্রগুলি পরিবর্তন করা হয়। পর্যায়ক্রমে, আপনি অন্যান্য পৃষ্ঠাগুলি সহ আপনার পৃষ্ঠায় লুকানো ইনপুট রাখতে পারেন, তবে এটি সমবর্তী সম্পাদনাগুলির সাথে খুব বন্ধুত্বপূর্ণ হবে না।

হালনাগাদ:

এখানে আপনার অবজেক্টের কিছু ক্ষেত্রকে আপডেট করার একটি অনির্ধারিত নমুনা রয়েছে (এটি ধরে নিচ্ছে যে আপনি লিনকিউকে এসকিউএল ব্যবহার করছেন):

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();

খুব সহায়ক :) আমি ভাবছিলাম যে তারিখটি নির্দিষ্ট না করে কেন পরিবর্তন করা হচ্ছে। আপনি কি তখন সম্পাদনা পদ্ধতিটি পরিবর্তন করতে সহায়তা করতে পারেন তাই এটি আর প্রয়োগপোপার্টিচেনজ ব্যবহার করে না? আমি যেমন এএসপি.এনইটি-তে নতুন এবং এই মুহূর্তে এটি পুরোপুরি বুঝতে পারছি না। ধন্যবাদ পাল
ক্যামেরন

আমি যদি বর্তমান তারিখের তারিখ নির্ধারণ করতে চাইতাম। তারিখের সময়টি নিবন্ধটি আপডেট করা হয়েছে? যেহেতু সম্ভবত এটি সর্বোত্তম বিকল্প হতে পারে এবং আমি ধারণা করি এটি আমার খেলতে থাকা অ্যাপলপ্রটিচেনিজগুলি নিয়ে কাজ করবে।
ক্যামেরন

আমার সম্পাদনা দেখুন (এটি অনুমান করা হয় যে modifiedDateএটি আপনার সম্পত্তির নাম)
জ্যাকব

সাবমিট চেঞ্জগুলি আমার অ্যাপে কাজ করে না: / story.modifiedDate = DateTime.Now;আমার বর্তমান কোডটিতে বিট যুক্ত করা কি সম্ভব ? ধন্যবাদ
ক্যামেরন

1
এই ত্রুটিটি ঘটে যখন আমরা পাবলিক ডেটটাইমের পরিবর্তে সার্বজনীন তারিখটাইম তৈরি করি? তৈরি করা তারিখ, কারণ ডেটটাইম নালাম হতে পারে না, তবে এটি কেন পরিসীমা ত্রুটির বাইরে দেয়। এটি সহায়ক হতে পারে তবে এটি আমার সমস্যার সমাধান করেছে।
আদনান

115

সত্তা ফ্রেমওয়ার্ক ব্যবহার করার সময় এটি লোকেদের একটি সাধারণ ত্রুটি। এটি তখন ঘটে যখন সারণীর সাথে যুক্ত থাকার সত্তাটির সংরক্ষণের একটি বাধ্যতামূলক তারিখের সময় ক্ষেত্র থাকে এবং আপনি এটি কোনও মান দিয়ে সেট করেন না।

ডিফল্ট ডেটটাইম অবজেক্টটি একটি মান দিয়ে তৈরি করা হয় 01/01/1000এবং শূন্যের জায়গায় ব্যবহৃত হবে। এটি ডেটটাইম কলামে প্রেরণ করা হবে যা তারিখের মানগুলি পরে থেকে ধরে রাখতে পারে 1753-01-01 00:00:00তবে এর আগে নয়, সীমার বাইরে ব্যতিক্রমের দিকে নিয়ে যায়।

এই ত্রুটিটি শূন্য স্বীকার করার জন্য ডাটাবেস ক্ষেত্রটি সংশোধন করে বা ক্ষেত্রটিকে একটি মান দিয়ে শুরু করে সমাধান করা যেতে পারে।


3
এটি তখন ঘটে যখন ডাটাবেসে তারিখের সময় ক্ষেত্রটি alচ্ছিক হয় এবং মান সেট না করা হয়। এটি সাধারণ মানুষের ত্রুটি নয় কারণ এটি EF এর অন্যতম স্থাপত্য বিষয়।
জিএসফ্ট পরামর্শ

1
আমি সম্মত EF এর ডিবি টাইপটি দেখতে হবে এবং সেই অনুযায়ী সামঞ্জস্য করা উচিত বা কমপক্ষে আরও সুনির্দিষ্ট ত্রুটি নিক্ষেপ করা উচিত। উল্টো দিকে, আমি আপনার উত্তরটি পছন্দ করি যেহেতু আপনি স্বাভাবিকের পরিবর্তে 2 টি বিকল্প সরবরাহ করেছেন - ন্যূনতম মান দিয়ে দায়েরকৃতকে আরম্ভ করুন।
দান্তে স্মিথ

43

DATETIME1753/1/1 কে "চিরন্তন" (9999/12/31) এ DATETIME2সমর্থন করে , অনন্তকাল ধরে 0001/1/1 সমর্থন করে।

MSDN

উত্তর: আমি মনে করি আপনি DateTime'0001/1/1' মান দিয়ে সংরক্ষণ করার চেষ্টা করেছেন। কেবল ব্রেকআপপয়েন্ট সেট করুন এবং এটি ডিবাগ করুন, যদি থাকে তবে এটির DateTimeসাথে প্রতিস্থাপন করুন nullবা সাধারণ তারিখটি সেট করুন।


তবে আমি কন্ট্রোলারে কী রাখি? ডিবাগিং কেবল ত্রুটিটি সামনে এনেছে যা আমি উপরে পোস্ট করেছি। ধন্যবাদ।
ক্যামেরন

এখানে ত্রুটি বলে মনে হচ্ছে -> _db.SaveChanges (); আপনি এই লাইনের আগে ব্রেকপয়েন্ট নির্ধারণ করতে পারেন ...
অ্যান্ড্রু ওরসিচ

হ্যাঁ করেছে। তারপরে এটি সেভচেনজেসগুলিতে তাদের ত্রুটি বলে তাই আমি ইনারএক্সেপশনটি দেখি এবং এটি বলে যে এটি ত্রুটি পোস্ট করার কারণে এটি ত্রুটি!
ক্যামেরন

_Db.SaveChanges () এর আগে আপনি কি ডেটটাইম মানটি পরীক্ষা করেছেন? বলা হয়? এটি '1753/1/1' এর চেয়ে দুর্দান্ত হবে।
অ্যান্ড্রু ওরিচ

আসলআর্টিকাল তারিখের মান {18/10/2009 00:00:00} এবং আর্টিকেল টু এডিট তারিখের মান {01/01/0001 00:00:00} সুতরাং মনে হয় এটি সমস্ত কিছুর চেয়ে ১ ম তারিখের পরিবর্তনের চেষ্টা করছে আমি চাই না তবে বিন্যাসটি ঠিক একই হওয়ায় এটি ত্রুটি কেন ছুঁড়েছে তা ব্যাখ্যা করে না?
ক্যামেরন

14

এই আমাকে পাগল করছে। আমি একটি নালাম তারিখের সময় ( DateTime?) ব্যবহার এড়াতে চেয়েছিলাম । আমার কাছে এসকিউএল ২০০৮ এর ডেটটাইম 2 টাইপ ( 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

ডেটক্রিটেডে নাল-মানযুক্ত সারিগুলি উপস্থিত করার ফলে এই ত্রুটি হয়েছিল। সুতরাং মানক মানের সাথে ক্ষেত্রটি আরম্ভ করার জন্য আমাকে এসকিউএল আপডেটের বিবৃতিটি ম্যানুয়ালি ব্যবহার করতে হয়েছিল।

আর একটি সমাধান দায়েরকৃত ডিফল্ট মানটির নির্দিষ্টকরণ হতে পারে।


3

আমার ক্ষেত্রে, ক্লাস থেকে প্রাথমিকের মধ্যে আমি ডাটাবেসের টেবিলে ব্যবহার করছিলাম, আমি আমার ডেটটাইম সম্পত্তিটিতে কোনও ডিফল্ট মান সেট করছিলাম না, ফলে @ অ্যান্ড্রু ওরিচের উত্তরটিতে সমস্যার ব্যাখ্যা দেওয়া হয়েছিল। তাই আমি সম্পত্তিটি কেবল অযোগ্য করে দিয়েছি। অথবা আমি কনস্ট্রাক্টরে এটি ডেটটাইমও দিতে পারতাম। আশা করি এটি কাউকে সাহায্য করবে।


3

দেখে মনে হচ্ছে আপনি সত্তার কাঠামো ব্যবহার করছেন। আমার সমাধানটি হ'ল সমস্ত ডেটটাইম কলামগুলি ডেটটাইম 2 তে স্যুইচ করা এবং কোনও নতুন কলামের জন্য ডেটটাইম 2 ব্যবহার করা, অন্য কথায়, ডিফল্টভাবে EF ডেটটাইম 2 ব্যবহার করে use এটি আপনার প্রসঙ্গে অনমোডেল তৈরির পদ্ধতিতে যুক্ত করুন:

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

যে সব ডেটটাইম এবং ডেটটাইম পাবেন? আপনার মডেল সমস্ত সত্তা বৈশিষ্ট্য।


2

আমার একই সমস্যা ছিল, দুর্ভাগ্যক্রমে, আমার মডেলটিতে আমার দুটি ডেটটাইম সম্পত্তি রয়েছে এবং আমি সেভচেন্জেস করার আগে একটি ডেটটাইম সম্পত্তি বাতিল।

সুতরাং পরিবর্তনগুলি সংরক্ষণ করার আগে আপনার মডেলটির ডেটটাইম মান রয়েছে তা নিশ্চিত করুন বা ত্রুটি রোধে এটিকে naclable করুন:

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

আপনি যদি সত্ত্বা ফ্রেমওয়ার্ক সংস্করণ> = 5 ব্যবহার করছেন তবে আপনার ক্লাসের ডেটটাইম বৈশিষ্ট্যগুলিতে [ডাটাবেস জেনারেটেড (ডাটাবেস জেনারেটেড অপশন.কম্পিউটেড)] টীকাগুলি প্রয়োগ করে ডাটাবেস টেবিলের ট্রিগারটি কারণ ছাড়াই রেকর্ড তৈরি ও রেকর্ড আপডেটের জন্য তারিখ প্রবেশের কাজটি করার অনুমতি দেবে আপনার সত্তা ফ্রেমওয়ার্ক কোড ঠাট্টা করা।

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

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

এটি ডঙ্গোলো জেনো রচিত এবং গিল কি দ্বারা সম্পাদিত the ষ্ঠ উত্তরের অনুরূপ


1

এছাড়াও, আপনি যদি কোডটির অংশটি জানেন না যেখানে ত্রুটি ঘটেছে, আপনি এসএসএল প্রোফাইলারকে এমএসকিএল-তে সংহত করে "খারাপ" এসকিএল এক্সিকিউশনটিকে প্রোফাইল করতে পারেন।

খারাপ ডেটটাইম পরম এরকম কিছু প্রদর্শন করবে:

খারাপ পরম


1

আপনি যখন কোনও সত্তা আপডেট করার চেষ্টা করছেন তখন এই সমস্যাটি সাধারণত ঘটে থাকে। উদাহরণস্বরূপ আপনার একটি সত্তা রয়েছে যার একটি নামক ক্ষেত্র রয়েছে DateCreatedযা [আবশ্যক] এবং যখন আপনি রেকর্ড সন্নিবেশ করেন তখন কোনও ত্রুটি ফিরে পাওয়া যায় না তবে আপনি যখন সেই নির্দিষ্ট সত্তাটি আপডেট করতে চান, আপনি পান

ডেটটাইম 2 রূপান্তর ত্রুটির বাইরে

এখন সমাধান এখানে:

আপনার সম্পাদনা দৃশ্যে, অর্থাৎ edit.cshtmlএমভিসি ব্যবহারকারীদের জন্য আপনাকে যা করতে হবে তা হ'ল আপনার জন্য একটি লুকানো ফর্ম ক্ষেত্র যুক্ত করাDateCreated সম্পাদনা ডেটার প্রাথমিক কীটির জন্য গোপন ক্ষেত্রের ঠিক নীচে ।

উদাহরণ:

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

আপনার সম্পাদনা দৃশ্যে এটি যুক্ত করা হচ্ছে, আমি আপনাকে আশ্বাস দিয়েছি যে ত্রুটি কখনও আপনার হবে না।


1

আপনার তারিখের পরিবর্তনশীলটির জন্য আপনাকে নাল মান সক্ষম করতে হবে:

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

0

আপনার সম্পত্তি nullable করার চেষ্টা করুন।

    public DateTime? Time{ get; set; }

আমার জন্য কাজ করেছেন।


0

আপনি যদি ডিবিতে অ্যাক্সেস পেয়ে থাকেন তবে আপনি ডিবি কলামের ধরণটি ডেটটাইম থেকে ডেটটাইম 2 (7) এ পরিবর্তন করতে পারবেন এটি এখনও একটি ডেটটাইম অবজেক্ট প্রেরণ করবে এবং এটি সংরক্ষণ করা হবে


0

মডেলটির অবনমিত তারিখ থাকা উচিত। পরিবর্তিত হওয়া অবজেক্টটি পুনরুদ্ধার করার পূর্বে প্রস্তাবিত পদ্ধতিটি প্রয়োগকোপার্টি চেঞ্জগুলির পরিবর্তে ব্যবহার করা উচিত। আমার ক্ষেত্রে আমার অবজেক্টটি সংরক্ষণ করার জন্য এই পদ্ধতিটি ছিল:

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 ডেটা টাইপকে একটি ডেটটাইম ডেটা টাইপের রূপান্তরকরণের ফলে সীমার বাইরে থাকা মান হয়।

না থাকার কারণে এই ত্রুটি ঘটেছেএসএফসিএল ডিবিতে ইএফ ব্যবহার করে কোনও নাল ডেট কলামের বিপরীতে কোনও মান নির্ধারণ এবং এটি নির্ধারণের মাধ্যমে সমাধান করা হয়েছিল।

আশাকরি এটা সাহায্য করবে!


0

ডেটাবেস প্রথম পদ্ধতির থেকে আমার ক্লাস তৈরি করার সময় এই সমস্যাটি পেয়েছি। কেবল কনভার্ট.ডেটটাইম (ডেটকৌজিংপ্রব্লেম) ব্যবহার করে সমাধান করা আসলে, পাস করার আগে সর্বদা মান রূপান্তর করার চেষ্টা করুন, এটি আপনাকে অপ্রত্যাশিত মান থেকে রক্ষা করে।


0

আপনাকে আপনার তারিখের ক্ষেত্রের ইনপুট ফর্ম্যাটটি প্রয়োজনীয় সত্তা বিন্যাসের সাথে মেলে করতে হবে যা yyyy / মিমি / ডিডি


1
অন্যান্য উত্তরগুলি রয়েছে যা ওপির প্রশ্ন সরবরাহ করে এবং কিছু সময় আগে সেগুলি পোস্ট করা হয়েছিল। উত্তর পোস্ট করার সময় দেখুন: আমি কীভাবে ভাল উত্তর লিখব? , দয়া করে নিশ্চিত হয়ে নিন যে আপনি কোনও নতুন সমাধান যুক্ত করেছেন, বা যথেষ্ট উত্তম ব্যাখ্যা, বিশেষত পুরানো প্রশ্নের উত্তর দেওয়ার সময়।
help-info.de
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.