2015-12-23 15 views
5

後の1を取得し、私はこの問題を解決する方法がわからないダニMySQLの「TIME」 Dapperを使用して1000フィールドのTimeフィールドを使用して行をロードし、このPocoを何も変更せずに保存した場合は、同じ行を再ロードしてください。Timeフィールドは1001 Ticksになります。のTimeSpanは、私がDapperのに問題がある保存

私は間違っていますか?

編集:私は私の行を読み込む方法

私はそれを保存する方法
var testobj = Db.Query<Test>("select * from Test where Id = @id", new {id = Id}); 

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

EDIT 2:

保存する前に、TimeSpanオブジェクト:

{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 

あなたはダニ5534.4億と5534.5億

EDIT 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; } 
    } 
} 

と、それは動作しますが、それはまだREPROへの私の試み

+1

どのように時間を読み込みますか? –

+0

@FᴀʀʜᴀɴAmy私の質問 – Baptiste

+0

を更新しました申し訳ありませんが、行がID = 1と時間= 1000ティックでロードされている、私はこの行を保存して再ロードして今すぐTime = 1001 Ticks – Baptiste

答えて

1

多くの研究の末、私の会社によって開発されたmysqlプラグインがありました。この問題で時間を無駄にして申し訳ありません。

+0

お気に入りの「バグ」タイプ - 私が作動しない(迅速な再試行を除いて)何かをする必要がありますが、何とかして時間をとるのに便利だと分かります; pあなたが問題を見つけたことをうれしく思います。 –

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

@Baptisteあなたは既存のデータベーステーブルの列の型について100%確信していますか? –

0

私の推測では、フィールドTimeは複数回修正されています(上書きされています)。多分別のスレッドによって。

フィールドreadonlyを作成してコンストラクタで一度初期化すると、以降のフィールドの変更はすべてコンパイラによって拒否されます。

+0

オブジェクトを保存した後でもTimeSpanオブジェクトは良好ですがデータベースには+1秒あります。 – Baptiste

+0

@Baptiste 'readonly'フィールドでチェックしましたか? –

+0

readonlyフィールドを設定することはできません.Dapperは行を読み込んでオブジェクトにマップするときに値を設定できません。 – Baptiste

関連する問題