マニュアルデータベースアップデート
自動データベースアップデートを無効にするには、autoSaveDatabaseUpdatesグローバルプロパティをfalseに設定します。本プロパティは初期設定ではtrueとなっており、すべてのデータベーステーブルのアップデート処理が制御されます。個々のテーブルの自動保存挙動を制御するには、テーブルオブジェクトのautoSaveUpdatesプロパティを設定します。自動保存を無効にすると、記録値に対するすべての変更がローカルで記録されるようになります。その後、save changesコマンドを利用して、データベースにこれらの変更を書き込むことができます。
例:
set the autoSaveDatabaseUpdates to false //自動アップデートを無効にします
set info to table "memberinfo" of myDB
set member to the record of info where memberNumber is 16
Add 60 days to member's expirationDate
put "23" into member's memberNumber
put the records of info //「((expirationdate:"2020-04-13", membernumber:"16"),(expirationdate:"2019-12-30", membernumber:"18"))」を表示します
save all changes to info //保留中のすべてのアップデートをテーブルに送信します
put the records of info //「((expirationdate:"2019-12-30", membernumber:"18"),(expirationdate:"2020-06-12", membernumber:"23"))」を表示します
自動保存を無効にすると、recordsToUpdate()関数を利用して、保存されていないアップデートが存在するテーブルからフェッチした記録のリストを入手できます。これらの記録は、save changesコマンドを利用する際に保存されます。以下の例では、自動保存を無効にする方法と、save changesコマンドを利用する際に保存される記録のログ方法を示しています。
例:
set myDB to (type:"odbc", DSN:"mySQLDB", user:"root", password:decodetext("AR@ts:%j"))
set the autoSaveDatabaseUpdates to false
set palette to table "colorpalette" of myDB
set myColor to the record of palette where color is "purple"
put "45" into myColor's brightness
log recordsToUpdate(palette) //「((brightness:"45", color:"purple", ID:"3"))」をログに記録します
記録アップデートのデータベースへの書き込み中に(save changesコマンドの結果として、または自動保存の結果からのいずれかで)エラーが発生する場合は、SenseTalkは例外を投げます。tryまたはcatchブロックが実際に例外をキャッチする場合は、failedUpdateRecords()関数とfailedUpdateExceptions()関数をテーブルに呼び出して、アップデートに失敗した変更が含まれる記録のリストと、これらの記録から生じた例外を、それぞれ入手することができます。
例:
try
set info to table "memberinfo" of myDB
set member to the record of info where memberNumber is 18
put "05/25/2018" into member's expirationDate
catch
put failedUpdateRecords(info) //「((expirationdate:"05/25/2018", membernumber:"18"))」を表示します
put failedUpdateExceptions(info) //「(ST_ODBC_ResultError: [MySQL][ODBC 5.3(a) Driver][mysqld-5.7.11-log]Incorrect date value: '05/25/2018' for column 'expirationdate' at row 1, SQLSTATE=HY000)」を表示します
end try