お世話になります。表題の件について質問させてください。
(データベースは、MySQLを本当に少し触ったことがあるだけで、
試行錯誤しながらやっています。プロの方から見れば、おそらく
つまらない質問だと思いますが、ご容赦をお願いできればと思います。)
現在、Delphi10.3+Windows10 home+SQLiteの環境で、簡単なデータベース
プログラムを作成しています。
その中で
Insert Into Table1 (Key, Str) Values (キー, 長文の文字列)
(Key、StrはどちらもText型、文字数制限なし。キーはどんなに長くても200文字ほどだが、
長文の文字列は2000文字以上といった長文が入ることがある。)
といったようなSQL文を作り、
FDCommand1.CommandText.Text := SQL文;
FDCommand1.Execute;
として実行しているのですが、この文字列の部分が特に長いとき、以下のエラーが出ます。
(厳密な発生条件は把握しきれておりませんが、SQL全体で、UTF8でカウントしたとき、
255バイトを超えたあたりで出るように思えます。)
[FireDAC][Phys]-323. 識別子が長すぎます (255 を越えています)
いろいろ検索すると、文字列に適当な長さで改行を入れるとよいようなのですが、
できれば元の文字列を壊したくなく、この255制限を発生させることなく、元の
SQL文を実行したいと思っています。
もしどなたかお知恵をお持ちでしたらお教えください。どうぞよろしくお願い
いたします。
TFDQueryでパラメータクエリにしたらどうですか?
http://docwiki.embarcadero.com/RADStudio/Rio/ja/%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E3%81%AE%E5%AE%9F%E8%A1%8C%EF%BC%88FireDAC%EF%BC%89
なんとかうまくできました。
fdqueryコンポーネントのSQLプロパティに雛形を登録して、変数としていじりたいところだけ、:keyのように、頭にコロンをつけておき、あとはfdquery.executeを行う直前にその変数を指定するためのparam操作を行うだけでずいぶんと簡単にできました。
エスケープ処理なども不要だったので、本当に楽に処理できました。
今日1日で書いた無駄なコードをバッサリと削除する寂しい場面もありましたが、コードが煩雑にならない、非常に効率的な方法を教えていただき、大変ありがたく感じています。
そもそも処理ができなかったところから見ると、本当に大きな進歩です。
大変助かりました。どうもありがとうございました。
ツイート | ![]() |