0

Telerik Data Access プロジェクトを使用したソリューションがあります。レコードを更新しようとしたときに問題が発生しました。問題は、更新しようとする前にデータベース内の null 値を持つ日付フィールドであるという事実に関係していると思いますが、よくわかりません。誰かがそれを回避する方法を教えてもらえますか?

MVC プロジェクトには、tblCoLocation というモデルがあります。これは、SQL データベースにリンクされています。モードは Data Access プロジェクトで次のように定義されています。

namespace Project.OpenAccess
{
public class tblCoLocation
 {
    public int LocID { get; set; }
    ...
    public DateTime ModOn { get; set; }
    public int ModBy { get; set; }
 }
}

データを更新するには、Repository.cs というファイルに次の方法があります。

public void UpdateCoLocation(tblCoLocation obj)
    {
        var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);

        if (upd != null)
        {
          upd.ModOn = obj.ModOn;
          upd.ModBy = obj.ModBy;
        }

        dat.SaveChanges();
    }

他のモデルを更新するための同様のコードがありますが、tblCoLocation ではエラーがスローされます。フィールド ModOn はデータベースで null です (これはクライアントの設計によるものです。null は、レコードが変更されていないことを意味し、データをそのように保持することを望んでいます)。ModOn を今日の日付に設定しようとしていますが、モデルが SaveChanges() コマンドにヒットしたときに ModOn の値があることを確認しました。データベースの ModBy に手動で値を入力すると、更新は期待どおりに機能します。これが、ModOn を最初に null にすることが問題になる可能性があると思う理由です。

このセクションに到達したときに発生するエラー (コードをステップ実行しましたが、エラーは dat.SaveChanges から発生します) は次のとおりです。

「/」アプリケーションでサーバー エラーが発生しました。SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。

例外の詳細: System.Data.SqlTypes.SqlTypeException: SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。

[SqlTypeException: SqlDateTime オーバーフロー。[

Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(Nullable 1 commandTimeout) +785
OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable`1 commandTimeout) +146
OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid, Int32 インデックス、ClassMetaData cmd、PersistGraph グラフ、Int32[] fieldNos、Boolean haveNewObjects、CharBuf s、BatchControlInfo batchControl、Boolean previousInserts) +3385

[DataStoreException: 更新に失敗しました: System.Data.SqlTypes.SqlTypeException: SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。Telerik.OpenAccess.RT.Adonet2Generic.Impl.PreparedStatementImp.executeUpdate(Nullable 1 commandTimeout) で OpenAccessRuntime.Relational.conn.PooledPreparedStatement.executeUpdate(Nullable1 commandTimeout) で OpenAccessRuntime.Relational.RelationalStorageManager.generateUpdates(OID oid、Int32 インデックス、ClassMetaData コマンド、PersistGraph グラフ、Int32[] fieldNos、Boolean haveNewObjects、CharBuf s、BatchControlInfo batchControl、Boolean previousInserts) 行: GenericOID@91ae60ab tblCoLocation LocID=5 UPDATE [tblCoLocation] SET [Address2] = ?, [Country] = ?, [ModBy] = ?, [ModOn] = ? WHERE [場所 ID] = ? AND [アドレス 2] = ? AND [国] = ? AND [ModBy] = ? AND [ModOn] = ? (パラメーター値を表示するには、イベント ログをすべてに設定します) System.Data.SqlTypes.SqlTypeException: SqlDateTime オーバーフロー。1753 年 1 月 1 日 12:00:00 AM から 9999 年 12 月 31 日 11:59:59 PM の間である必要があります。で

データベース内の ModOn の初期ヌル値が問題を引き起こしていると推測するのは正しいように見えますか? その場合、ModOn の初期値を変更せずにこのレコードを保存するにはどうすればよいですか?

4

1 に答える 1

0

これは、値ModOnが であることを意味する値を設定しないことを意味します1/1/0001。この値は、SQL 日時フィールドに格納できません。obj.ModOnの有効な日付が 1753 年 1 月 1 日よりも大きいことを確認するか、SQL 列をdatetime2型に変更することができます。

これを実行して、保存する前に値を SqlDateTime.MinValue に変更することもできます。ただし、使用して列をオプションにしなかったためDateTime?、検証の問題がどこかにある可能性があります。

public void UpdateCoLocation(tblCoLocation obj) {
    var upd = dat.tblCoLocations.FirstOrDefault(itm => itm.LocID == obj.LocID);

    if (upd != null) {
        upd.ModOn = obj.ModOn < System.Data.SqlTypes.SqlDateTime.MinValue ? 
            System.Data.SqlTypes.SqlDateTime.MinValue : 
            obj.ModOn;
        upd.ModBy = obj.ModBy;
    }

    dat.SaveChanges();
}
于 2015-07-16T21:19:04.850 に答える