SQLite を使用して、通常はサーバーからデータを要求する .NET アプリケーション用のオフライン キャッシュを作成しようとしています。データベースとテーブル定義の部分は既に正常に動作しており、ほとんどの場合、データのロードも正常に動作しています。テスト テーブルに約 14,000 行をキャッシュしていますが、データはほとんど正しいです。問題は、SQL タイムスタンプ値を構成するデータをSystem.Data.SQLite
ラッパーに永続化させることができないように見えることです。byte[]
何よりもまず、タイムスタンプを別のもの (文字列や数値データなど) としてエンコードできることを認識している必要がありますが、可能であれば、代わりにネイティブの BLOB 機能を使用したいと考えています。それでは、そこから始めましょう。
テーブル DDL は次のようになります。
CREATE TABLE Accounts
(
AccountID Int NOT NULL,
-- ...
Timestamp BLOB
)
ただし、 、 、 、および for の列タイプも試しVARBINARY
ましVARBINARY(4000)
たBINARY
がGENERAL
、Timestamp
結果に違いはありませんでした。
挿入時に、次のようなパラメーター化された SQL コマンドを生成します (わかりやすくするために多くのフィールドを削除しています)。
INSERT INTO Accounts (AccountID, Timestamp)
SELECT @AccountID, @Timestamp
WHERE NOT EXISTS (SELECT 1 FROM Accounts WHERE AccountID = @AccountID)
パラメータ@Timestamp
にはDbType
ofが指定されBinary
、適切なサイズが設定されており、挿入された行の他のすべてのデータは問題なく表示されます。しかし、何らかの理由で、Timestamp
null のままです。これはなぜでしょうか?
byte[8]
値は、予想される内容で検証可能です。実際、列の型を変更して文字列アフィニティを指定するDbType.String
と、列には「System.Byte[]」が格納されます。
列に null 値があるという事実は確かです。まず、SQLite Database Browser を使用してデータベース ファイルを開いて見るだけです。次に、を使用して 2 番目のテーブルに列を設定すると(SELECT MAX(Timestamp) FROM Accounts)
、フィールドが null のままになります。すべての行の Timestamp が null である場合に限ります。
それで、何が欠けているのでしょうか?
** 編集 **
すべての人への注意: これはSQLiteであり、SQL CE ではありません。一部の回答は、この 2 つを混同しているようです。