日記帳
本ページはプロモーションが含まれています
カテゴリー
Links
blog(ブログ)マスター
アンドロイドの巣
ゼロから始めるベランダ菜園
タイトル
2025年2月
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28

Delphi DB 「BLOB は変更されています」

アプリケーション起動
- レコード移動
- 特定のレコードを通過すると

ボン
 「BLOB は変更されています」

うっ、みたことのないエラー 嫌な予感。

Delphi2005で作ったソフトでエラーが発生しました。
.Netへ 移行
  .Netへ ゴー
それいけ .Net プロジェクト始動中なのに
 なんてひどい「しうち」。
Delphiとは、さようなら のはずなのに
また、不本意ながら 仕方なくDelphiを起動。

なんとなくDBの破損だとは、思うのですが、
なにせ paradox形式なので修復ツールがない。

...2分経過 問題の場所がわからない。

27個しかレコードがないのに壊れるのは勘弁してほしい。
やはり破損か?

(1)dbのバックアップ
(2)データベースデスクトップ データ再構築をクリック
  壊れた...。
(3)気を取り直して、ソフトでバッチムーブで再構築をクリック
(4)データがいくつか消滅したがまぁいいとしよう。

この際、ついでなので 今後のためにDBも変更。

(5)データ書き出しをクリック
(6)firebirdオプションを定義して再コンパイル
(7)同じフォルダにfirebird embededをコピー
(8)データ取り込みをクリック
(9)動作確認 ok
firebirdへ移行完了。
paradoxよ さようなら。
そして、もう破損しないことを祈りつつ

 解決!!

さらば Delphi

さぁ .Netへ レッツゴー
2010.12.06

sqlite2からsqlite3に移行していると
いくつかの不具合を発見してしまった。
とりあえず、教えたけど 直るかは不明。
ソースを10分くらい解析すればパッチくらい作れるけど
レンタルサーバーでは通用しないというか面倒なので
対処法で解決するほうが無難。

sqlite3のSELECT 文 評価の際の内部バグ。

一つ紹介しておこう

"列名"が必ず""列名""でくくられて変更されてしまう欠陥。
もし、遭遇した場合は、
回避するには、SELECT "列名" as '新しい名前'で回避するしかない
"列名"を使い countやsumなどを使った場合に注意が必要だ。
※version2には、この欠陥は存在しない


追記
 移行完了
 確かに、説明にあるようにDBファイルが小さくなって速くなった気がする。

 また今後、ドライバ関数の変更に振り回されないように
共通の独自クラスを作って、その中で、PDOとSQLite3クラスを判別して処理するように工夫をした。
 今後なにか別のクラスが発生した場合は関数10個程度に、追加・書き込みするだけで済む。
 SQL文とその関数を修正しなくて済むようになったので、かなりいい。
2010.11.04

公式サイトのformatchng.htmlには、2と3は、完全に互換性がないと書いてあります。
ということで、変換が必要になります。

公式サイトから、sqlite.exe sqlite3.exeをダウンロードします
(※sqlite.exe(sqlite-2_8_17.zip): ソース sqlite-2.8.17.tar.gz


コマンドプロンプトなどで
変換するコマンド
直接生成する場合
sqlite.exe old.db .dump | sqlite3.exe new.db

一度テキストに保存したい場合
sqlite.exe old.db .dump > old_db_dump.sql
ここで、必要に応じて、old_db_dump.sqlを修正します
sqlite3.exe new.db < old_db_dump.sql

※問題点
sqlite.exe(2.8.17) のダンプがキーワードをエスケープしない欠陥があるので
定義済みキーワードを使ったテーブル、列名などがある場合、
取り込みでエラーを起こす可能性があります
その場合、一度テキストにダンプして一括修正後、取り込みが必要になります
sqlite3.exeのダンプでは、問題ないようです。

例 sqlite.exe のダンプ: INSERT INTO item VALUES(1);
例 sqlite3.exe のダンプ: INSERT INTO "item" VALUES(1);

例: create table "where" (id text);
INSERT INTO "where" VALUES(1);

追記
sqlite.exe(sqlite 2.8.17)のパッチ

sqlite-2.8.17-47fee16ba9bd8ab2.diff
--- SQLite-47fee16ba9bd8ab2/src/shell.c 2007-01-08 16:20:28.000000000 +0900
+++ SQLite-47fee16ba9bd8ab2/src/shell.c 2010-11-04 23:00:00.000000000 +0900
@@ -421,7 +421,7 @@
p->zDestTable = 0;
}
if( zName==0 ) return;
- needQuote = !isalpha(*zName) && *zName!='_';
+ needQuote = *zName!='_';
for(i=n=0; zName[i]; i++, n++){
if( !isalnum(zName[i]) && zName[i]!='_' ){
needQuote = 1;

追記: 2011.12
バイナリデータを含んでいた場合、DUMPに失敗することがわかりました。
patch2を作りました。
別記事になります。
sqlite patch p2
で検索してください。
2010.11.02

Firebird 2.5 が公開されています。
さっそくインストール と
その前に、付属文書を読んで概要を確認しました。

うーん、
データベースに文字コード指定できるくらいで
あまりメリットがない。
ということで、 2.1.xを継続利用することに決定。

そもそも、アプリケーションがshift-jisだから
dbがunicode対応になってもなんの恩恵もない。

Firebirdは、
サイズは大きいけどクラッシュしないから、いい。
ポータブルなアプリケーションにもってこいのdb
ただし、日本の参考書が皆無。
英語のマニュアルか古いinterbaseの解説書あたりしか参考にできない。

Mysqlやoracleの時代なんだし
embedバージョンがなかったらFirebirdってただのゴミだよね。

SQliteって世の中にあるけど、あれは、もっとゴミ。
ほとんど書き込みのない設定ファイルくらいには、いいけど
データをばんばんいれるのには、向いていないよね。

2010.10.27

Databaseをfirbirdにしてから破損が起きないのでいい感じ♪

firbirdは、InterBaseと共通のツールから利用できます♪

私のDB破損歴
・MDB(access)
・Paradox
・DBase
・SQLite(Web使用時)、説明書にWebは壊れるとありました(^_^;

今の所、快適動作(-2010)
・firbird (1.5 , 2.1 , normal and embeded)
・MySQL

postgresqlは、定期的にダウンロードはしているものの
まだインストール自体したことがありません。

【ローカルPCのお勧めDB】
・MySQL
・postgresql

【Webのお勧めDB】
・MySQL
・postgresql
X SQLiteは書き込みがかぶると破損するので、避けましょう。

【結論】
参考書の多い
postgresqlかMySQLが無難でしょう

firbirdは、参考書が皆無なので、
英語が読めない場合は、避けた方がいいでしょう。

設計・構築の前に
データベースのサイトにいって
「まずはじめに」 みたいな題名のページをよく読みましょう。
データベースによって、向き不向きのケースが解説されていますので
目的にあったデータベースを探しましょう。
2010.05.12



PR

[PR]