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月17日 13:53 発信者:Wutian
題名:RE(10):PB12.6: MySQLへのINSERTができるようになった~その後~
お力になれず、申し訳ないです。
状況的に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 (記載なし)
Copyright © 2013 Power Future Co., Ltd.