1

SQLite を使用して、通常はサーバーからデータを要求する .NET アプリケーション用のオフライン キャッシュを作成しようとしています。データベースとテーブル定義の部分は既に正常に動作しており、ほとんどの場合、データのロードも正常に動作しています。テスト テーブルに約 14,000 行をキャッシュしていますが、データはほとんど正しいです。問題は、SQL タイムスタンプ値を構成するデータをSystem.Data.SQLiteラッパーに永続化させることができないように見えることです。byte[]

何よりもまず、タイムスタンプを別のもの (文字列や数値データなど) としてエンコードできることを認識している必要がありますが、可能であれば、代わりにネイティブの BLOB 機能を使用したいと考えています。それでは、そこから始めましょう。

テーブル DDL は次のようになります。

CREATE TABLE Accounts
(
    AccountID Int NOT NULL,
    -- ...
    Timestamp BLOB
)

ただし、 、 、 、および for の列タイプも試しVARBINARYましVARBINARY(4000)BINARYGENERALTimestamp結果に違いはありませんでした。

挿入時に、次のようなパラメーター化された SQL コマンドを生成します (わかりやすくするために多くのフィールドを削除しています)。

INSERT INTO Accounts (AccountID, Timestamp)
SELECT @AccountID, @Timestamp
WHERE NOT EXISTS (SELECT 1 FROM Accounts WHERE AccountID = @AccountID)

パラメータ@TimestampにはDbTypeofが指定されBinary、適切なサイズが設定されており、挿入された行の他のすべてのデータは問題なく表示されます。しかし、何らかの理由で、Timestampnull のままです。これはなぜでしょうか?

byte[8]値は、予想される内容で検証可能です。実際、列の型を変更して文字列アフィニティを指定するDbType.Stringと、列には「System.Byte[]」が格納されます。

列に null 値があるという事実は確かです。まず、SQLite Database Browser を使用してデータベース ファイルを開いて見るだけです。次に、を使用して 2 番目のテーブルに列を設定すると(SELECT MAX(Timestamp) FROM Accounts)、フィールドが null のままになります。すべての行の Timestamp が null である場合に限ります。

それで、何が欠けているのでしょうか?

** 編集 **

すべての人への注意: これはSQLiteであり、SQL CE ではありません。一部の回答は、この 2 つを混同しているようです。

4

1 に答える 1