刹那(せつな)の瞬き

Willkömmen! Ich heiße Setsuna. Haben Sie etwas Zeit für mich?

ずっと困ってたQODBCの問題がQt6.5.0で解消されたっぽい

macOS / Linux での話です。

Qt 6.3 がリリースされた頃くらいからでしょうか。
macOS / Linux 環境で動作してた Qt5 (qmake) プロジェクトを少しづつ Qt6 (cmake) に移行・確認する作業をしてます。

Qt5 と Qt6 で動作結果が異なるケースは徐々に減り、私の手持ちでは ODBC ドライバでSQL Server を扱うものだけが残りました。

Qt6 の QODBC で困ってた事

Qt5 -> Q6 では QODBC3 -> QODBC と変更するだけで済むと思ってたのですが...
細かい部分で差異があり、スムーズに移行できません。

私が遭遇した中で、特に大きな問題は 2 つです。

  1. データベースの NULL 値の扱いが Qt5 と異なる動作をする場合がある。
  2. プレースホルダを経由すると項目に余計な終端文字 (0x00, 0x00) が付加される。

これらは 0S や Qt6 / QODBC のバージョンによって発現するパターンが変わるため、なかなか現象・原因を特定できずにいました。

1 つ目は QVariant 型に入った結果セットの項目を isNull() で判別する処理の動作結果が、期待通り Qt5 と同様になる場合と、そうでない場合がありました。

2 つ目は、SQL の SELECT 文では問題ない(ように見える)のですが、INSERT, UPDATE 文を処理すると、データベース項目に終端文字が付加されてしまいます。

私は macOS で処理したデータを Linux (Qt5) で確認した際に動作の差異に気づき、Azure Data Studio で SELECT CAST(書き込んだ項目 AS VARBINARY) FROM... 等として内容を確認したところ、文字列の末尾に余計な終端文字を見つけました。

Qt 6.5.0 で再確認 -> OK!

その後、Qt6 のバージョンアップに伴い、細かい問題点も同時に解消されつつあり、Linux 環境では少し前に Qt 6.5.0 で問題ない事を確認してます。

macOS 環境は、本日の brew updateで qt, qt-unixodbc が outdated になったので、 brew upgrade を実行。qt, qt-unixodbc はそれぞれ 6.5.0 に更新されました。

早速、件のプロジェクトを試してみたところ、まったく問題ありません。
あの足掻きは何だったのかというくらい、すんなり動作しました。

これでやっと一区切りというか、ようやく Qt5 の頃に戻った感じです。

安心したいんだけど...

うろ覚えなのですが、過去のバージョンでも Linux 環境では一度はすべて解消してたような記憶もあります。
すっかり安心してたし、急ぐ案件ではないので、しばらく放置してたのですが...

間を空けて Qt6 をアップデートしたら、問題が再発してました。
諸事情により macOS に開発環境を移しても同様の結果でした。

そのうち解消されるだろうと、さらに放置してたのですが一向に改善しません。
特に最近のバージョンでもある Qt 6.4.3 で確認した際は、macOS で前述の 2 つの問題が同時に発現してたので、「もう Qt6 の ODBC は期待できないのかな...」と軽く絶望してました。

とりあえず、私の環境では macOS / Linux どちらも問題ないのは Qt 6.5.0 が最初です。

そろそろ Qt5 は忘れて Qt6 だけにしたいんだけど、もう大丈夫なのかな...
Qt Creator10.0.1になったし、そもそも Qt6 推しだし、大丈夫かな...
大丈夫だといいな。

※追記
  • 2023-05-26 Qt 6.5.1 (macOS: homebrew) 問題なし
  • 2023-10-08 Qt 6.5.2 (macOS: homebrew) 問題なし
  • 2023-11-02 Qt 6.6.0 (macOS: homebrew) 問題なし
  • 2023-11-08 Qt 6.6.0 (Ubuntu: apt) 問題なし

もう大丈夫かな。