2015-12-23 5 views
5
बचाने

मैं व्यवसायिक के साथ समस्या है +1 मिलता है, मैं इसे ठीक करने का पता नहीं है:TimeSpan टिक्स के बाद

मैं एक पोको इस तरह है:

public class Test 
{ 
    public long Id { get; set; } 
    public TimeSpan? Time { get; set; } 
} 

क्षेत्र समय एक है MySQL 'TIME'। यदि मैं उदाहरण के लिए 1000 टिक के साथ एक समय फ़ील्ड के साथ डैपर के साथ एक पंक्ति लोड करता हूं, और मैं इस पॉको को कुछ भी बदले बिना सहेजता हूं, फिर उसी पंक्ति को फिर से लोड करता हूं, टाइम फ़ील्ड अब 1001 टिक पर है।

मैं क्या गलत कर रहा हूं?

संपादित करें:

मैं अपने पंक्ति कैसे लोड:

var testobj = Db.Query<Test>("select * from Test where Id = @id", new {id = Id}); 

मैं इसे कैसे को बचाने:

Db.Execute("replace into Test values (@Id,@Time)", testObj); 

संपादित करें 2:

एक समयावधि वस्तु से पहले बचाने:

{15:22:24} 
    Days: 0 
    Hours: 15 
    Milliseconds: 0 
    Minutes: 22 
    Seconds: 24 
    Ticks: 553440000000 
    TotalDays: 0.64055555555555554 
    TotalHours: 15.373333333333333 
    TotalMilliseconds: 55344000.0 
    TotalMinutes: 922.4 
    TotalSeconds: 55344.0 

और बाद बचाने:

{15:22:25} 
    Days: 0 
    Hours: 15 
    Milliseconds: 0 
    Minutes: 22 
    Seconds: 25 
    Ticks: 553450000000 
    TotalDays: 0.64056712962962958 
    TotalHours: 15.37361111111111 
    TotalMilliseconds: 55345000.0 
    TotalMinutes: 922.41666666666674 
    TotalSeconds: 55345.0 

आप देखते हैं कि Ticks 553,440,000,000 और बन सकता है 553450000000

संपादित करें 3:

मैं इस तरह मेरे टेस्ट वर्ग के साथ हंस टिप का उपयोग करें:

public class Test 
{ 
    public long Id { get; set; } 
    private TimeSpan? _time; 

    public TimeSpan? Time 
    { 
     get 
     { 
      if (_time.HasValue) 
       return TimeSpan.FromTicks((long)Math.Floor(_time.Value.Ticks/100000000d) * 100000000); 
      return _time; 
     } 
     set { _time = value; } 
    } 
} 

और यह काम करता है, लेकिन यह अभी भी अजीब

+1

आप समय कैसे लोड करते हैं? –

+0

@ FᴀʀʜᴀɴAɴᴀᴍ मैंने अपना प्रश्न – Baptiste

+0

क्षमा किया है, मुझे खेद नहीं है, पंक्ति आईडी = 1 और समय = 1000 टिकों से भरी हुई है, मैं इस पंक्ति को सहेजता हूं, इसे फिर से लोड करता हूं, और अब समय = 1001 टिक – Baptiste

उत्तर

1

अधिक शोध के बाद, मेरी कंपनी द्वारा विकसित एक MySQL प्लगइन था जो कुछ मामलों में कुछ खास कर रहा था। इस मुद्दे पर समय के नुकसान के लिए खेद है।

+0

प्रारंभ करना चाहिए मेरा पसंदीदा प्रकार "बग" - वह एक जहां मैं actu नहीं करता सहयोगी को कुछ भी करने की आवश्यकता है (एक त्वरित repro प्रयास को छोड़कर), लेकिन समय लेने के लिए किसी भी तरह से उपयोगी लग रहा है; पी खुशी है कि आप समस्या मिली। –

0

रेप्रो मेरे प्रयास ठीक काम करता है:

[FactMySql] 
public void Issue426_SO34439033_DateTimeGainsTicks() 
{ 
    using (var conn = GetMySqlConnection()) 
    { 
     try { conn.Execute("drop table Issue426_Test"); } catch { } 
     try { conn.Execute("create table Issue426_Test (Id int not null, Time time not null)"); } catch { } 
     const long ticks = 553440000000; 
     const int Id = 426; 

     var localObj = new Issue426_Test 
     { 
      Id = Id, 
      Time = TimeSpan.FromTicks(ticks) // from code example 
     }; 
     conn.Execute("replace into Issue426_Test values (@Id,@Time)", localObj); 

     var dbObj = conn.Query<Issue426_Test>("select * from Issue426_Test where Id = @id", new { id = Id }).Single(); 
     dbObj.Id.IsEqualTo(Id); 
     dbObj.Time.Value.Ticks.IsEqualTo(ticks); 

    } 
} 

जो कुछ भी वास्तविक समस्या है: मैं इसे पुन: पेश करने में कुछ मदद की जरूरत करने जा रहा हूँ। यह ठीक है काम करने के लिए लगता है।

+0

मेरे पास कुछ ख़बरें हैं, ऐसा लगता है कि मैं जिस डेटाबेस डेटाबेस के साथ काम करता हूं, उसके साथ काम करता है, अगर मैं एक ही टेबल बनाता हूं, तो दूसरी स्कीमा पर एक ही पंक्ति डालें, यह काम करता है। मैं वास्तव में समझ में नहीं आता। – Baptiste

+0

@ बैपटिस्ट और क्या आप मौजूदा डेटाबेस तालिका में कॉलम प्रकार के बारे में 100% सुनिश्चित हैं? –

0

मेरा अनुमान है, क्षेत्र Time को एक से अधिक बार संशोधित किया जा रहा है (अधिलेखित)। शायद एक और धागे से।

सुनिश्चित करने के लिए, क्षेत्र readonly बनाएं और इसे एक बार कन्स्ट्रक्टर में प्रारंभ करें, और क्षेत्र को संशोधित करने के सभी निम्नलिखित प्रयासों को संकलक द्वारा अस्वीकार कर दिया जाएगा।

+0

मुझे ऐसा नहीं लगता है, क्योंकि ऑब्जेक्ट को सहेजने के बाद, टाइमस्पेन ऑब्जेक्ट अभी भी अच्छा है, लेकिन डेटाबेस में मेरे पास +1 सेकंड है। – Baptiste

+0

@ बैपटिस्ट क्या आपने 'रीडोनली' फ़ील्ड के साथ जांच की थी? –

+0

आप एक रीडोनली फ़ील्ड सेट नहीं कर सकते हैं, डैपर मूल्य को सेट नहीं कर सकता है जब यह पंक्ति को पढ़ता है और उसे ऑब्जेक्ट पर मैप करता है – Baptiste

संबंधित मुद्दे