環境:Windows 10 Home、Delphi 10.3.2 Communutiy eddition、sqlite3.dll ver 3.31.1
フォームに
FDConnection1
FDPhysSQLiteDriverLink1
FDGUIxWaitCursor1
Datasource1
FDQuery1
DBGrid1
を配置、接続し、オブジェクトインスペクタから
FDConnection1.Params に
DriverID=SQLite
Database=path+databasename
StringFormat= Unicode
を、
FDQuery1.SQLに
select * FROM Tablename
を設定し、
FDConnection1.connectedをtrueに,
FDQuery1.activeをtrueにしますと、
DBGrid1にtablenameの内容が表示されます(通常)
しかしtablenameに日本語(全角文字)が使われていると以下のメッセージが出てエラーになる模様です。
(但し、他の原因かもわかりません。)
[FireDAC][Phys][SQLite] ERROR:no such table:tablename.
テーブル名を変更する以外の対処法があれば教えて下さい。
Delphi 10.3.3 Professinalですが、
CREATE TABLE てすと
(
TEST VARCHAR(16)
);
で、テーブルを作成し、
INSERT INTO てすと (TEST) VALUES ('one');
INSERT INTO てすと (TEST) VALUES ('two');
INSERT INTO てすと (TEST) VALUES ('three');
でデータ追加、
SELECT * FROM てすと;
で試しても、普通に表示できますね。
ちなみに、Delphi 10.3.3 では FireDAC も更新され、SQLiteドライバは 3.23.1から3.28になってますね。
対象のdatabaseは旧SQLiteドライバでつくったもので、当該テーブルも管理ツールTkSQLiteでは表示されています。
SQLiteドライバのバージョン違いが原因かもです。
igy様ご指摘のように、新規にテーブルを作ってテストしてみます。
新規にテーブルを作ってテストしてみましたが、状況は変わりません。
テーブル名、フィールド名に日本語を含まないテーブルでは機能しますので、
文字コードの問題か?
もう手に負えませんので、give upします。
簡単なテストプログラムを作って本当にテーブル名が漢字なのが原因なのか調べる方が解決出来るかと思います。
データベース操作をプログラム以外のツールからもできる場合は
ツールから作った漢字のテーブル名をプログラムから見ることが出来るか?
プログラムで作ったテーブル名は、ツールからはどう表示されるか?
でわかりやすくなりそうです。
no such tableエラーは、テーブルが見つからない以外にも表示されるので
テーブルが見つからない以外の原因かもしれません。
take様、有用なsuggestionを有難うございます。
テーブルはコマンドプロンプトから、また管理ツールからも確認できますので、
no such tableエラーが出るのは、
FireDACが日本語のテーブル名、カラム名に対応していないから、
と推量します。
テーブル名、カラム名は英数文字でという太古の教えは現代でもいきているのですね。
解決とは言えませんが、手続き上解決としておきます。
SQLiteも詳しくないし試してもいないのですが、ASCII範囲外の文字を含むテーブル名やカラム名を
シングルクォート(')、ダブルクォート(")、バッククォート(`)のいずれかで括ったらどうでしょう?
既に試していたらすいません。
HFUKUSHI 様、有用なsuggestionを有難うございます。
テーブル名が日本語、カラム名が英数文字では進展ありませんでした。
次に
テーブル名が英数文字、カラム名が日本語のcaseをテストしてみました。
CREATE TABLE TEST2 ("てすと" VARCHAR(16) );
INSERT INTO TEST2 ("てすと") VALUES ('one');
INSERT INTO TEST2 ("てすと") VALUES ('two');
INSERT INTO TEST2 ("てすと") VALUES ('three');
で作った、テーブル名が英数文字、カラム名が日本語のテーブルでテストしました。
FDQuery1.SQLに select * FROM TEST2 をセットしてFDQuery1.activeをtrueにしますと
やはり、no such tableエラーが出るのですが、もう一度FDQuery1.activeをtrueにしますと、
今度は通してくれます。
DBGridにはカラム名は(おそらくdefaultの)「 無名0 」となっています。
データのone,two,threeは表示されていませんが、レコード数は3となっています。
カラム名も日本語はダメですよ、と言ってるようです。
プロのDBエンジニアの方々は今もテーブル名、カラム名は英数文字派なのですか?
プロじゃ無いけど、テーブルの一覧でクエリまで表示されるデータベースだったら頭3文字 tbl とか sqlとか付けるかも
名称に漢字が使えるデータベースで楽だと思って漢字を使ってもそんなに便利じゃ無い
でも漢字を使わなかったら思いつきで変な和製英語が爆誕するからどっちもどっち
プログラム上だとテーブル名は定数で定義するからどっちでも変わらない
まさにこういうことがあるのでデータベースのいろいろなものの名前はASCII範囲に収めてます。DBのプロではありませんが。
(使うRDBすべてに精通していれば問題ないのかもしれませんが…
take様、なるほど!な情報を有難うございました。
編集 削除HFUKUSHI様、貴重なご意見を有難うございました。
編集 削除カラム名も漢字で、試してみました。
CREATE TABLE "都道府県"
(
"番号" INTEGER NOT NULL PRIMARY KEY
,"都道府県名" VARCHAR(16)
);
で、テーブルを作成し、
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (40, '福岡県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '佐賀県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (42, '長崎県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (43, '熊本県');
でデータ追加、
SELECT
"番号"
,"都道府県名"
FROM
"都道府県"
WHERE
"番号" > 40;
をDBGridに表示。
Delphi 10.3.3 + FireDAC (SQLiteドライバ 3.28)
Delphi 10.3.3 + dbExpress + SQLite3.dll Ver.3.31.1
Delphi XE + UniDAC 8.1.2 + SQLite3.dll Ver.3.31.1
Delphi XE + ZeosLib 7.2.6 + SQLite3.dll Ver.3.31.1
のいずれも、DBGridのタイトル行にカラム名(番号・都道府県名)も表示され、
データも正しく表示できました。
igy様、私のprimitiveな質問のために、
貴重な時間を割いて多くの接続テストをして頂いて有難うございます。
FDQuery1.open('select sqlite_version() as ver ');
showmessage(FDQuery1.FieldByName('ver').asstring);
で確認しました当方のFireDACのSQLiteドライバも3.28.0でした。
では、なぜ??????????????
再確認のため
CREATE TABLE "都道府県"
(
"番号" INTEGER NOT NULL PRIMARY KEY
,"都道府県名" VARCHAR(16)
);
で、テーブルを作成し、
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (40, '福岡県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '佐賀県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (42, '長崎県');
INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (43, '熊本県');
でデータ追加し、
(管理ツールtksqliteで確認後)
FDQuery1.SQLに
SELECT
"番号"
,"都道府県名"
FROM
"都道府県"
WHERE
"番号" > 40;
をセットしてDBGridに表示を試みましたが、
やはり、
[FireDAC][Phys][SQLite] ERROR:no such table:都道府県.
がでます。
ウ~ン、不可解・・・・・
何か、もっと基本的なところで、ミスや思い違いを犯しているのかも知れません。
もし、試せるなら、以下の方法で、テーブル一覧を取得してみてください。
ListBoxを追加して、
FDConnection1.GetTableNames('', '', '', ListBox1.Items, [osMy], [tkTable], False);
で、取得できると思います。
私のほうでは、テストしたテーブルは、
"都道府県"
と表示されています。
FDConnection1.GetTableNames('', '', '', ListBox1.Items, [osMy], [tkTable], False);
を実行しました結果、
"都道府県"
は文字化けしています。
取り急ぎご報告いたします。
SQLite,文字コードを設定(変更)・確認する
https://iwakurabit.com/training-sqlite3-check-or-set-character-code/
に記述されている
pragma encoding
で、私が試したデータベースファイルの文字コードは、
UTF-8
だったのですが、lactone さんがお使いのデータベースファイルの文字コードも、
UTF-8
となりますか?
pragma encoding
で
UTF-8
であることを確認しました。
ちなみに、テーブルの作成とデータの追加は、
> 管理ツールtksqlite
で行いましたか?
テーブルの作成とデータの追加はコマンドラインで行いました。
編集 削除> テーブルの作成とデータの追加はコマンドラインで行いました。
もしかしたら、コマンドラインだと、Windowsの場合、UTF-8じゃなく、Shift-JISになるとか・・
コード上で、デーブル作成・データ追加した場合、どうなりますか?
// テーブル生成
try
with DModuleDB.FDQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('CREATE TABLE "都道府県"');
SQL.Add('(');
SQL.Add(' "番号" INTEGER NOT NULL PRIMARY KEY');
SQL.Add(' ,"都道府県名" VARCHAR(16) ');
SQL.Add(');');
ExecSQL;
end;
except
on E: Exception do
MessageDlg('SQLエラー:' + E.Message, mtError, [mbOk], 0);
end;
// データ追加
try
with DModuleDB.FDQuery1 do
begin
Close;
SQL.Clear;
SQL.Add('INSERT INTO "都道府県" ("番号", "都道府県名") VALUES (41, '''佐賀県'''); ');
ExecSQL;
end;
except
on E: Exception do
MessageDlg('SQLエラー:' + E.Message, mtError, [mbOk], 0);
end;
なるほど!です。
SQLでの追加を試みて見ます。
結果は追ってご報告いたします。
igy様には無限の感謝の意を表します。
成功しました!!!!
ご教示の通りで、エラー回避できました。
>もしかしたら、コマンドラインだと、Windowsの場合、UTF-8じゃなく、Shift-JISになるとか・・
原因がわかり、過去3日間のモヤモヤが晴れました。
本当に、ありがとうございました。
テスト接続は成功しましたので、
あとは、既存のshft-jisのデータベースをutf-8に変換できるか、という問題になりますが、
これは別のスレッドを立てるのが適切と思います。
繰り返します。
igy様、ありがとうございました、