PB 電子会議室

コメント

発言No. 更新日 題名(クリックすると発言内容と関連するコメントが表示されます)
24609 21/02/22 09:36:26 RE(12):PB12.6: MySQLへのINSERTができるようになった~その後~ By Wutian
24608 21/02/18 12:31:57 RE(11):PB12.6: MySQLへのINSERTができるようになった~その後~ By JBI
24607 21/02/17 13:53:20 RE(10):PB12.6: MySQLへのINSERTができるようになった~その後~ By Wutian
24606 21/02/17 12:42:31 RE(9):PB12.6: MySQLへのINSERTができるようになった~その後~ By JBI
24605 21/02/16 14:38:42 RE(8):PB12.6: MySQLへのINSERTができるようになった~その後~ By Wutian
24604 21/02/16 10:54:11 RE(7):PB12.6: MySQLへのINSERTができるようになった~その後~ By JBI
24603 21/02/15 11:56:22 RE(6):PB12.6: MySQLへのINSERTができない By JBI
24602 21/02/15 09:50:10 RE(5):PB12.6: MySQLへのINSERTができない By Wutian
24601 21/02/09 13:20:47 RE(5):PB12.6: MySQLへのINSERTができない By ハチ公
24600 21/02/09 11:55:12 RE(4):PB12.6: MySQLへのINSERTができない By JBI
24599 21/02/09 10:51:10 RE(3):PB12.6: MySQLへのINSERTができない By ハチ公
24598 21/02/08 11:27:32 RE(2):PB12.6: MySQLへのINSERTができない By JBI
24597 21/02/08 10:58:42 RE:PB12.6: MySQLへのINSERTができない By Lucky Rabbit
24596 21/02/03 11:53:25 PB12.6: MySQLへのINSERTができない By JBI

カテゴリ:PowerBuilderの開発環境
日付:2021年02月22日 09:36 発信者:Wutian
題名:RE(12):PB12.6: MySQLへのINSERTができるようになった~その後~

PowerBuilderからJDBCを使ったデータベース接続は経験がないので、明確にお答えできないです。
ごめんなさい。

JDBC使うにはドライバーによって使用するJDKのバージョンとか違うので、そのあたり注意しないと
いけないです。ちなみにPowerBuilderにはJDK1.6が付属してますが、最近のJDBCドライバーだと
サポートされてない可能性が高い(JDK1.6は古すぎるので)です。

また、PowerBuilderのマニュアルを見る限り、サポートされているJDBCのデータ型も制約などありそう
なので、一度マニュアルは確認されたほうが良いかと思います。
(すでに確認済みだったら、ごめんなさい)
https://docs.appeon.com/pb2019r3/connecting_to_your_database/ch02s02.html

Appeonコミュニティを見ると、PowerBuilderでMySQLを使ったときの問題が結構あるようです。
JBIさんの環境で同じ問題がないか、確認されたほうが良いと思います。
https://community.appeon.com/index.php/qna/q-a/pb-2019-execute-mysql-stored-procedure


>Wutian様

>ありがとうございます。

>ODBCドライバーの相性(?)というコメントを頂き、JDBC接続に変更しようと試みました。
>jarファイルを入手したものの、ドライバ名やURLに何を記載していいかわからず断念しました。
>無知過ぎて自分で嫌になりますが、ここでしか相談できる場所がなくまたお聞きすることになってしましました。
>JDBC接続についてご教授いただけませんでしょうか?
>よろしくお願いします。

>>お力になれず、申し訳ないです。
>>
>>状況的にMySQLの中でトランザクションが終了しないんだと思いますが、
>>PowerBuilderとMySQL/MySQL ODBCドライバーの相性(?)なのかもしれませんね。
>>
>>「PowerBuilder Totalworksystem」というツールはMySQL版もあるくらいだから
>>使えないことは無いのでしょうが・・・MySQL 5.7と8の違い???
>>
>>
>>>いろいろ調べてくださりありがとうございます。
>>>
>>>START TRANSACTIONやBEGINという記述はプログラム内のどこでも使用していませんでした。
>>>commit;を削除して試してみたところ、動作は全く変わらず、commit;しなくても
>>>トランザクションを切断するとINSERTされました。
>>>autocommitもオフにしてみましたが、変わらずです。
>>>
>>>もうわからないので毎回
>>>disconnect USING sqlca;
>>>connect using sqlca;
>>>の記述で逃げようかと思っています。
>>>
>>>
>>>>なんだか根が深そうですね・・・
>>>>
>>>>MySQLはSTART TRANSACTIONまたはBEGINと書くとautocommit設定を無視して、トランザクションを開始するようです。
>>>>参考:https://dev.mysql.com/doc/refman/5.6/ja/commit.html
>>>>
>>>>connectからこのSQLまでにSTART TRANSACTIONやBEGINという記述があって、commit/rollbackしてない箇所はないですか?
>>>>MySQLはトランザクションのネストができないようなので、これが原因とは思えないですが、該当のSQLだけしか見てない
>>>>ので、一応前後の処理も確認した方が良いかもしれません。
>>>>
>>>>また、AutocomitがONなのに、Commitを書いてるから変になっているかもしれないですね・・・(ホントに?)
>>>>トランザクション処理が不要なのであれば、commit;を削除して試してみてはどうでしょうか?
>>>>
>>>>
>>>>
>>>>
>>>>
>>>>>追加情報です。
>>>>>
>>>>>commit;
>>>>>のあとに、
>>>>>disconnect USING sqlca;
>>>>>を入れると、PBで作成している画面を終了しなくてもINSERTやUPDATE処理ができるようになりました。
>>>>>しかし、DBは切断された状態になっているため
>>>>>connect using sqlca;
>>>>>を入れないと続きの画面操作ができなくなります。
>>>>>
>>>>>INSERTやUPDATEを処理する度に
>>>>>disconnect USING sqlca;
>>>>>connect using sqlca;
>>>>>を入れるのは無駄な気がするので、
>>>>>commit;
>>>>>だけでINSERTやUPDATEができるようにするにはどうしたらいいのでしょうか?
>>>>>ご教授ください。よろしくお願いいたします。
>>>>>
>>>>>
>>>>>>ありがとうございます。
>>>>>>
>>>>>>INSERT ~ using sqlca; commit;と分けると、INSERTやUPDATEができるようになりました。
>>>>>>しかしまた別の問題が発生しました。
>>>>>>INSERTやUPDATEがされるタイミングが、PBで作成している画面を終了し、
>>>>>>トランザクションが切断されたときにまとめて処理されるのです。
>>>>>>そこでMySQLのAutoCommitの設定を確認しましたが、AutoCommitはオンの状態でした。
>>>>>>PBの設定SQLCA.AutoCommitもTrueにしましたが、
>>>>>>状態は変わらずトランザクションが終了したときにコミットされます。
>>>>>>他にどのような設定が考えられますでしょうか?
>>>>>>
>>>>>>よろしくお願いいたします。
>>>>>>
>>>>>>>MySQLのトランザクション処理はかなり特殊?なようです。
>>>>>>>
>>>>>>>私もMySQLに精通しているわけではないので、ググっただけですが、
>>>>>>>AutoCommitがデフォルトでONだったり、AutoCommit=OFFでもSELECTなどの
>>>>>>>SQL発行時点からトランザクションが開始されるなど、SQLServerで通って
>>>>>>>いるからといって、(MySQLでも)問題ないとは判断できないのではと思います。
>>>>>>>
>>>>>>>INSERT処理の抜粋で見ると、INSERT処理の流れでcommit using sqlca;としてますが、
>>>>>>>私はcommitは分離して実行したいので、INSERT ~ using sqlca; commit;と分けます。
>>>>>>>SQLServerではINSERTの流れでcommitでも良いのかもしれませんが、MySQLではNGなら
>>>>>>>この部分は角変える必要があるし、そもそも、AutoCommitなどの設定値が違っていれば
>>>>>>>その内容に合わせてトランザクション処理を見直したほうが良いと思います。
>>>>>>>
>>>>>>>明確な解決策を提示できてないですが、まずはMySQLの設定から見直してSQLServerとの
>>>>>>>違いを明確に把握したほうが良いのではないでしょうか。
>>>>>>>
>>>>>>>
>>>>>>>>ありがとうございます。
>>>>>>>>
>>>>>>>>仰る通り、埋め込みSQLで困っています。
>>>>>>>>私はPowerBuilderはかなりの初心者で、前任者が今回のシステムを構築し、
>>>>>>>>MySQLへのマイグレーションする部分からの引継ぎのため、
>>>>>>>>データウインドウの作成等はまったくやり方がわかっていません。
>>>>>>>>ですので、ご教授頂いたデータウインドウは作成できていません。
>>>>>>>>
>>>>>>>>前回の補足ですが、commit using sqlca;をexecute using sqlca;に変更すると
>>>>>>>>エラーは出ますが、INSERTされました。
>>>>>>>>しかし、変更したときの1回のみで、それ以降は何回やってもINSERTされません。
>>>>>>>>この現象もよくわからず、どうしていいか途方に暮れています。
>>>>>>>>何かヒントをお持ちでしたらご教授ください。
>>>>>>>>よろしくお願いいたします。
>>>>>>>>
>>>>>>>>
>>>>>>>>>おはようございます。
>>>>>>>>>埋め込みSQLで起きている問題を解決できないようですね。
>>>>>>>>>私も環境がないので検証できませんが、データウインドウを作成して、InsertRow,Updateできますでしょうか?
>>>>>>>>>もし、これができるとした場合、データウインドウのSqlprevewイベントの引数をMessageBoxで表示して、流れているSQLを確認することができます。
>>>>>>>>>
>>>>>>>>>
>>>>>>>>>>ありがとうございます。
>>>>>>>>>>ご教示頂いた通りにリテラルで囲んでみましたが、結果は変わりませんでした。
>>>>>>>>>>補足ですが、エラーメッセージがでる件は、
>>>>>>>>>>commit using sqlca;をusing sqlca;に変更すると
>>>>>>>>>>エラーは出なくなります。
>>>>>>>>>>しかし、結果は変わらずINSERTされません。
>>>>>>>>>>他に何か方法がありましたらご教授願います。
>>>>>>>>>>よろしくお願いいたします。
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>
>>>>>>>>>>>こんにちは
>>>>>>>>>>>MySQLの環境を持っていないのでわかりませんが、テーブル名とカラム名をリテラルで囲んでみてください。
>>>>>>>>>>>DBプロファイルにあります、「構文」「リテラルで囲む」をチェックONし、DBParmも確認してDB接続してください。
>>>>>>>>>>>DBごとに、大文字、小文字の扱いもあるようです。
>>>>>>>>>>>以上、よろしくお願いいたします。
>>>>>>>>>>>
>>>>>>>>>>>>お世話になります。
>>>>>>>>>>>>
>>>>>>>>>>>>同じプログラムを色々なデータベースで処理できるようなシステムを作っています。
>>>>>>>>>>>>これまではSQLServer、Oracleに接続、処理できるように作成しました。
>>>>>>>>>>>>
>>>>>>>>>>>>今回はその同じプログラムを使用して、MySQLをデータベースにしているのですが、
>>>>>>>>>>>>SELECTはできるのですが、その他のINSERT、UPDATE、DELETEがうまくできません。
>>>>>>>>>>>>
>>>>>>>>>>>>うまくいかないINSERT処理の抜粋を記載します。
>>>>>>>>>>>>
>>>>>>>>>>>>datetime wlog_time
>>>>>>>>>>>>wlog_time = datetime(today(),now())
>>>>>>>>>>>>※:set_は他で取得できています。
>>>>>>>>>>>>  INSERT INTO USYS_LOG (
>>>>>>>>>>>>   USER_ID,
>>>>>>>>>>>>   ACTION_MSG,
>>>>>>>>>>>>   PGM_ID,
>>>>>>>>>>>>   TABLE_ID,
>>>>>>>>>>>>   LOG_TIME,
>>>>>>>>>>>>   STATUS_MSG
>>>>>>>>>>>>   )
>>>>>>>>>>>>  VALUES (
>>>>>>>>>>>>   :set_user_id,
>>>>>>>>>>>>   :set_action_msg,
>>>>>>>>>>>>   null,
>>>>>>>>>>>>   null,
>>>>>>>>>>>>   :wlog_time,
>>>>>>>>>>>>   :set_status_msg
>>>>>>>>>>>>   )
>>>>>>>>>>>>   commit using sqlca;
>>>>>>>>>>>>
>>>>>>>>>>>>実行すると以下のエラーメッセージを取得しました。
>>>>>>>>>>>>SQLDBCode=1064
>>>>>>>>>>>>sqlstate=37000
>>>>>>>>>>>>[MySQL][ODBC 8.0(w) Driver][mysqld-8.0.23]
>>>>>>>>>>>>You have an error in your SQL syntax;
>>>>>>>>>>>>check the manual that corresponds to your MySQL server version for the right syntax to use near 'commit' at line 1
>>>>>>>>>>>>
>>>>>>>>>>>>しかし、同じプログラムでデータベースをSQLServerに変更するとちゃんとINSERT処理されます。
>>>>>>>>>>>>何がおかしいのか全くわからないので教えてください。
>>>>>>>>>>>>よろしくお願いいたします。

付加情報:

PowerBuilder Version 12.6

Client SoftWare

OS Windows10
DBMS その他
Browser Chrome

Server SoftWare

OS (記載なし)
DBMS (記載なし)
WebServer (記載なし)

PowerSpaceの運営は、パワーフューチャー株式会社が行っております。
Copyright © 2013 Power Future Co., Ltd.