5

SQLiteには、データ型に関係なく、任意のフィールドに何でも格納できるという興味深い「機能」があります。

http://www.sqlite.org/different.html#typing

この「機能」を(ab)使用して作成された外部で作成されたSQLiteファイルを読み取る必要があります。VARCHAR(30)として定義されたフィールドがありますが、100文字以上の文字列を格納するために使用しています。SQLite DLLを直接呼び出してデータを保存する場合、SQLiteはトリミングを行わずにこれを実行します。

私は現在、これらのファイルを読み取るためにSQLiteをサポートするDevArt UniDAC 3.70.0.19を使用していますが、定義されているフィールドのサイズをかなり尊重しているため、30文字の長さのTStringFieldオブジェクトを作成します。この30文字の制限を超えて保存されたすべての文字にアクセスできません。

私はSQLiteで利用可能なすべてのDelphiソリューションを知っていますが、誰かがこの「機能」を処理できるものがあるかどうか教えてもらえますか?

4

4 に答える 4

3

これは、TDatasetレイヤーを使用せずに、sqliteエンジンへの直接アクセスレイヤーを使用して行うことができます。

たとえば、オープンソースラッパーhttp://blog.synopse.info/post/2011/07/22/SynDBSQLite3%3A-SQLite3-direct-access

実際、ほとんどのSQLデータベースとは異なり、SQLiteは、列の宣言された型に基づいて列に挿入される可能性のあるデータの型を制限しません。代わりに、SQLiteは動的型付けを使用します。宣言された列のタイプは、列のアフィニティを決定するためにのみ使用されます。Db.pasレイヤーを使用せずに直接アクセスすると、この独自の機能を使用できます。

于 2012-12-18T06:15:00.467 に答える
0

あなたのソリューションは、sqlite 自体に置くことができます。スキーマはデフォルトでは書き込み可能ではありません (sqlite_master テーブルを更新することはできません) が、適切な知識とPRAGMA writable_schema=ON;の少しの助けが必要です。あなたはこれを行うことができます。したがって、一部の変更は安全です。たとえば、VARCHAR(N) を VARCHAR(M) に変更すると、sqlite は括弧内の数字を気にしません。

ステップ 1、スキーマは 30 文字に制限されています

CREATE TABLE [TestTable] (
[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
[Txt] VARCHAR(30)
)

以下の行は sqlite_table の変更を許可します

PRAGMA writable_schema=ON;

そして、次のステートメントは制限を 100 に変更します。

Update sqlite_master set sql='CREATE TABLE [TestTable] (
[Id] INTEGER PRIMARY KEY AUTOINCREMENT,
[Txt] VARCHAR(100)
)' where tbl_name='TestTable' and type='table'

ただし、 SQLiteはスキーマの情報に基づいた何らかのストレージ形式を想定しているため、一部の変更は歓迎されないため、何をしているのかを認識しておく必要があります。Varchar から varchar への変換では、ストレージ形式は変更されません

于 2012-12-18T21:03:47.913 に答える
0

sqlite3.dll の周りに非常に薄いラッパーが必要だったので、OleVariants に大きく基づいた独自のラッパーを作成しました。

https://github.com/stijnsanders/TSQLite

また、クエリ結果が提供するもの以外の型チェックを追加していないため、説明したように列型を「無視」する必要があります。

于 2012-12-19T11:58:44.263 に答える