2009-03-14 12 views
5

पर जारी नहीं रहेगा। मैं एएसपी.नेट एमवीसी प्रोजेक्ट पर बैकएंड के रूप में एनएचबीनेटनेट के साथ काम कर रहा हूं और मुझे कुछ SQL सर्वर डेटाबेस टेबल पर लिखने में कुछ परेशानी हो रही है।NHBernate DateTime SqlDateTime ओवरफ़्लो

ये दिनांक फ़ील्ड शून्य नहीं हैं, इसलिए यहां कई उत्तरों को नामुमकिन डेटाटाइम सेट करने के तरीके के बारे में मदद नहीं मिली है।

असल में जब मैं उस इकाई को सहेजने का प्रयास करता हूं जिसमें दिनांक जोड़ा गया है और अंतिम अद्यतन फ़ील्ड है, तो मुझे एक SqlDateTime ओवरफ़्लो अपवाद मिल रहा है। मुझे अतीत में एक ही समस्या है जहां मैं एक स्टेल्डडटाइम कॉलम में डेटाटाइम फ़ील्ड लिखने की कोशिश कर रहा था, समस्या को ठीक करने के लिए कॉलम पर टाइप को अपडेट करना था। मेरी आंत महसूस यह है कि यह टेबल परिभाषा या कुछ प्रकार के असंगत डेटा प्रकारों के साथ कुछ समस्या होने जा रहा है, और अतिप्रवाह अपवाद एक बम स्टीयर का थोड़ा सा है।

मैंने टेबल परिभाषा का एक उदाहरण संलग्न किया है और एनएचबर्ननेट चलाने की कोशिश कर रहा है, किसी भी मदद या सुझावों की सराहना की जाएगी।

CREATE TABLE [dbo].[CustomPages](
    [ID] [uniqueidentifier] NOT NULL, 
    [StoreID] [uniqueidentifier] NOT NULL, 
    [DateAdded] [datetime] NOT NULL, 
    [AddedByID] [uniqueidentifier] NOT NULL, 
    [LastUpdated] [datetime] NOT NULL, 
    [LastUpdatedByID] [uniqueidentifier] NOT NULL, 
    [Title] [nvarchar](150) NOT NULL, 
    [Term] [nvarchar](150) NOT NULL, 
    [Content] [ntext] NULL 
) 

exec sp_executesql N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID) VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',N'@p0 
nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier',@p0=N'Size and Colour 
Chart',@p1=N'size-and-colour-chart',@p2=N'This is the size and colour chart',@p3=''2009-03-14 14:29:37:000'',@p4=''2009-03-14 
14:29:37:000'',@p5='48315F9F-0E00-4654-A2C0-62FB466E529D',@p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C',@p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55' 

जवाब में उत्तर/टिप्पणियों, मैं धाराप्रवाह NHibernate का उपयोग कर रहा था और इसके फलस्वरूप मानचित्रण

public CustomPageMap() { 

      WithTable("CustomPages"); 

      Id(x => x.ID, "ID") 
       .WithUnsavedValue(Guid.Empty) 
      . GeneratedBy.Guid(); 

      References(x => x.Store, "StoreID"); 

      Map(x => x.DateAdded, "DateAdded"); 
      References(x => x.AddedBy, "AddedById"); 
      Map(x => x.LastUpdated, "LastUpdated"); 
      References(x => x.LastUpdatedBy, "LastUpdatedById"); 


      Map(x => x.Title, "Title"); 
      Map(x => x.Term, "Term"); 
      Map(x => x.Content, "Content"); 

     } 

    <?xml version="1.0" encoding="utf-8"?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" default-lazy="false" assembly="MyNamespace.Core" namespace="MyNamespace.Core"> 
<class name="CustomPage" table="CustomPages" xmlns="urn:nhibernate-mapping-2.2"> 
<id name="ID" column="ID" type="Guid" unsaved-value="00000000-0000-0000-0000-000000000000"><generator class="guid" /></id> 
<property name="Title" column="Title" length="100" type="String"><column name="Title" /></property> 
<property name="Term" column="Term" length="100" type="String"><column name="Term" /></property> 
<property name="Content" column="Content" length="100" type="String"><column name="Content" /></property> 
<property name="LastUpdated" column="LastUpdated" type="DateTime"><column name="LastUpdated" /></property> 
<property name="DateAdded" column="DateAdded" type="DateTime"><column name="DateAdded" /></property> 
<many-to-one name="Store" column="StoreID" /><many-to-one name="LastUpdatedBy" column="LastUpdatedById" /> 
<many-to-one name="AddedBy" column="AddedById" /></class></hibernate-mapping> 
+0

आपकी तालिका और एसक्यूएल ठीक लगता है। क्या आप SQL क्वेरी काम करते हैं यदि आप इसे हाथ से चलाने का प्रयास करते हैं? कोड और हाइबरनेट मैपिंग फ़ाइल को पोस्ट करने के लायक हो सकता है –

+0

हां क्वेरी क्वेरी क्वेरी विश्लेषक में ठीक है, सिवाय इसके कि मुझे डेटाटाइम के आसपास डबल सिंगल कोट्स (यूटीसी स्टाइल स्ट्रिंग्स) को सिंगल कोट्स में बदलना है, यह क्वेरी है nhibernate –

उत्तर

0

नीचे है क्यों @ p3 और @ p4 2x एकल उद्धरण है? त्रुटि कॉपी और पेस्ट करें?

मैं जांच नहीं कर सकता (एसक्यूएल यहाँ स्थापित नहीं), लेकिन millisecond separator "डॉट", कि है, नहीं होना चाहिए "2009-03-14 14: 29: 37.000"

@ p3 है "पहले", @ p4 यहाँ "के बाद" है:

exec sp_executesql 
    N'INSERT INTO CustomPages (Title, Term, Content, LastUpdated, DateAdded, StoreID, LastUpdatedById, AddedById, ID) 
    VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)', 
    N'@p0 nvarchar(21),@p1 nvarchar(21),@p2 nvarchar(33),@p3 datetime,@p4 datetime,@p5 uniqueidentifier,@p6 uniqueidentifier,@p7 uniqueidentifier,@p8 uniqueidentifier', 

    @p0=N'Size and Colour Chart', 
    @p1=N'size-and-colour-chart', 
    @p2=N'This is the size and colour chart', 
    @p3=''2009-03-14 14:29:37:000'', --quotes + dot wrong? 
    @p4='2009-03-14 14:29:37.000', --quotes + dot correct? 
    @p5='48315F9F-0E00-4654-A2C0-62FB466E529D', 
    @p6='1480221A-605A-4D72-B0E5-E1FE72C5D43C', 
    @p7='1480221A-605A-4D72-B0E5-E1FE72C5D43C', 
    @p8='1E421F9E-9A00-49CF-9180-DCD22FCE7F55' 
+0

द्वारा उत्पन्न हां, मैंने सोचा कि जिस तरह से यह तारीखों को प्रस्तुत करता है वह थोड़ा अजीब था, हालांकि यह क्वेरी विश्लेषक में काम करता है सिवाय इसके कि मुझे सिंगल कोट्स के लिए डबल कोट्स को स्वैप करना है। मैंने निबर्ननेट डॉको के अध्याय 5 में देखा था कि मैं बोली को सही करने के लिए कह सकता हूं, लेकिन यह संभव दिखता है –

+0

200 9-03-14 14: 2 9: 37: 000 प्रारूप गलत है हालांकि SQL सर्वर – gbn

+0

बोली के लिए हो सकता है अपनी समस्या हो आप क्यों कहते हैं कि इसे सेट करना संभव नहीं है? आप अपना सत्र कारखाना कैसे बना रहे हैं? क्या आप इसे कॉन्फ़िगरेशन फ़ाइल से पढ़ रहे हैं, या इसे प्रोग्रामेटिक रूप से बना रहे हैं? –

0

अपने प्रश्न में SQL स्क्रिप्ट मेरे एसक्यूएल 2005 स्थापना पर ठीक से क्रियान्वित (एक बार मैं तय बोली मुद्दों GBN द्वारा उठाया)। और आपका मैपिंग भी ठीक दिखता है। बहुत कम मदद के लिए खेद है।

0

मैं इस मैपिंग को बनाने के लिए एस # आर्किटेक्चर/फ्लेंटेंबर्ननेट का उपयोग कर रहा था, मैंने नवीनतम संस्करण में अपग्रेड किया है और ऐसा लगता है कि यह ठीक काम कर रहा है।

17

वास्तव में दृश्य के पीछे कारण यह है:

जब NHibernate, डाटाबेस से पंक्ति पढ़ता मान शून्य है, और है कि क्या सत्र याद करते है। जब ऑब्जेक्ट को एनएचबर्ननेट द्वारा बहाल किया जाता है तो तिथि डेटटाइम मान पर सेट की जाती है। MinValue। जब सत्र डीबी के साथ सिंक्रनाइज़ किया जाता है, तो NHibernate मानता है कि कुछ बदल गया है, क्योंकि वर्तमान स्थिति और पिछले स्तर अलग हैं और पंक्ति को अद्यतन करने का प्रयास करता है। जो बदले में विफल रहता है, क्योंकि डेटटाइम। MinValue एक SQL सर्वर डेटाटाइम कॉलम में फिट नहीं होगा।

समाधान: या तो अपना डेटाटाइम न तो डालने योग्य बनाएं? डेटटाइम के अंत में डेटटाइम की तरह? या Nullable

पूरा लेख में पाया जा सकता: nhibernate-sqldatetime-overflow-issue

+0

मेरी समस्या हल हो गई। –

0

बस एक FYI करें, मैं के एम्बेडेड डेटा एक्सेस दृष्टिकोण एक किस्म से NHibernate करने के लिए एक मौजूदा ऐप्लिकेशन को माइग्रेट करने पर काम कर रहा है। यह मुद्दा जल्दी से आया, और मुझे एक आसान समाधान मिला जो मौजूदा कार्यात्मक एप्लिकेशन कोड पर प्रभाव को कम करता है। चूंकि हम कुछ मामलों में परत से माइग्रेट कर रहे हैं, इसलिए डेटा क्लास इंटरफ़ेस को यथासंभव स्थिर रहने की आवश्यकता है।यहां समाधान सार्वजनिक इंटरफ़ेस के लिए डेटटाइम प्रकारों का उपयोग करना जारी रखना था, निजी क्षेत्र प्रकारों में एक्सटेंशन विधियों को मिनवैल्यू से नल तक और वापस एक्सेसर्स में निजी फ़ील्ड पर कनवर्ट करने के लिए, और निजी फ़ील्ड में nHibernate को मानचित्र बनाना था।

जेएफ

1

मैं गैर नल datetime कॉलम के साथ ही समस्या की मेज और एक को बचाने पर एक SqlDateTime अतिप्रवाह सामना करना पड़ा।

मेरे मामले में वास्तविक समस्या यह थी कि सहेजने ने session.flush को ट्रिगर किया जो उसी सत्र का उपयोग करके पहले लोड किए गए कुछ ऑब्जेक्ट को अपडेट करता है। इस ऑब्जेक्ट में 'डेटाटाइम फ़ील्ड थे जहां शून्य डेटाटाइम फ़ील्ड का उपयोग किया जाना चाहिए' मुद्दा था।

दूसरे शब्दों में: सहेजने से पहले सत्र या फ्लैश करने का प्रयास करें यह जांचने के लिए कि क्या समस्या उसी सत्र ऑब्जेक्ट के पहले उपयोग के कारण हो सकती है।

आशा है कि किसी को भी मदद मिलेगी।