0

NHibernateで問題が発生しました。サーバーで実行されているステートメントが、パラメーターを使用しようとすると失敗しDateTimeます。

パラメータはとして渡されています'2012-04-15 19:52:55.7230000'が、これは精度が高すぎてdatetime:に変換できません。

exec sp_executesql N'
    INSERT INTO [People].[NameChanges]
     (
        Revision, 
        MadeAtDateTime,
        MadeAtOffset,
        MadeBy,
        Title,
        Forename,
        Surname,
        Person,
        ID
    ) 
    VALUES (@p0, @p1, @p2, @p3, @p4, @p5, @p6, @p7, @p8)',
    N'@p0 int,
      @p1 datetime,
      @p2 bigint,
      @p3 nvarchar(4000),
      @p4 nvarchar(4000),
      @p5 nvarchar(4000),
      @p6 nvarchar(4000),
      @p7 bigint,
      @p8 uniqueidentifier',

     @p0=0,
     @p1='2012-04-15 19:52:55.7230000',
     @p2=36000000000,
     @p3=N'',
     @p4=N'Mr',
     @p5=N'Ezra',
     @p6=N'Awesomesauce',
     @p7=1969929945,
     @p8='4D045A70-A474-4D36-8841-DDB16BBB147D'

メッセージ8114、レベル16、状態5、行0

データ型varcharをdatetimeに変換中にエラーが発生しました。

問題を確認するために、次のステートメントを実行しました。

declare @DateTime datetime = '2012-04-15 19:52:55.7230000'

そしてメッセージを受け取りました:

メッセージ241、レベル16、状態1、行1

文字列から日付や時刻を変換するときに変換に失敗しました。

datetime2SQL 2008 Expressデータベースで実行していますが、SQL 2005と互換性のあるスキーマが必要なため、簡単な回避策としてデータ型に切り替えるオプションがありません。

フォーマットはNHibernateよりもSQLADO.NETドライバーの一部であるように感じますが、NHibernateがどのようにステートメントを生成して、データベースが解析できるものにフォーマットを変更する必要があるかをより正確に尋ねる方法については十分にわかりません。 。

理想的には、文化関連の問題を回避するために、ISO 8601を使用するか、ANSISQLフォーマットを引き続き使用したいと思います。

この問題を修正するにはどうすればよいですか?

4

1 に答える 1

2

NHibernate のDateTime値のフォーマットは、インターフェイスを介して、内部型システムによって制御されITypeます。

私のシナリオでは、NHibernate は のシリアライズ可能な型DateTimeDbTimestamp. この型には、SQL Server のdatetimeデータ型でネイティブに使用できる精度よりも高い精度が含まれているため、文字列を に変換しようとするとオーバーフローが発生しますdatetime

解決策は、NHibernate のType.DateTime型を使用するようにカスタム型を明示的に設定することでした。これは秒までの時間のみを含み、datetime型に適切に適合します。

于 2012-04-16T11:18:23.957 に答える