Sqlserverでテーブルを作成して添付ファイルの為のフィールドをvarbinary(MAX)で作成しました。
それをAccessでリンクテーブルにして、フォームからダイレクトに操作する場合は更新ができますが、非連結フォームから更新をかけると
さらに詳しく
「複数ステップの操作でエラーが発生しました。各状態の値を確認してください。」
というエラーから抜けられませんでした。
メッセージ交換システム
何をやろうとしていたかと言えば、Sqlserverにデータベースを置いて、端末はAccessを使ってメッセージ交換システムを作成してみようと考えた事でした。
メッセージを交換するだけなら何の問題も無かったのですが、添付ファイル機能も実装しようと考えた時から困難がでてきました。
Access単体で使用する場合なら、テーブル作成時にフィールドの型を添付ファイル型というのがあるようです。
しかし、Sqlserverからのリンクテーブルにそんなデータ型は存在しません。
そこで、FILESTREAMという機能があるようですが、今の自分のスキルでは太刀打ちできませんでした。
https://pctips.jp/server/sqlserver-filestream/
そこで、Sqlserverのテーブルのデータ型を、varbinary(MAX)で作成すると、Accessでリンクテーブルにすると、OLE オブジェクト型という型になり、テーブルをフォームにすると、ファイルをドラック&ドロップするだけで添付ファイル機能になりました。
SqlserverリンクテーブルOLEオブジェクト型は癖だらけ
簡単に添付ファイル機能が実装できて良かったと思っていたら、WordやExcelファイルを添付すると、フォームに設置した窓にはファイルのアイコンではなく、中身が小さく表示されるのです。何か設定方法があるのかもしれませんが、PDFファイルや圧縮ファイルの場合はアイコン表示されますので、この2ファイルに限定しようと決めました。
また、ヒューマンミスを減らすために、フォームで直接テーブルを操作することは避けたいので、表示、入力、修正・削除という感じで3つのフォームを準備してVBAを使って処理をかけました。
表示は、パススルークエリを使ってフォームのソースにしてミスを避けるような策を講じました。
入力は、非連結フォームを準備してレコードに追加処理するようにしました。
問題は、修正・削除の、修正の方です。
フォームのOLE窓で編集したファイルは、エラーが出て更新することができません。
半日以上かけて原因追及をしましたが、結局、あきらめる決断をしました。
OLEオブジェクトはVBAで更新できない?
色んなVBAコードを試してみましたが、
ココがダメ
非連結フォームから更新したOLEオブジェクト型ファイルは更新できない
という自分の結論にしました。
更新できないんじゃ、どうしたらいいの?
つまり、テーブルを直接操作できるフォームなら更新できるので、それしか方法がありません。
直接操作なので、更新ボタンも必要もない手軽さですが、それがヒューマンミスにつながる事は言うまでもありません。
データベースに添付ファイルを埋め込む困難
Accessデータベースだけで行う添付ファイル機能なら簡単なのでしょうが、Accessデータベースに添付ファイルを付けるとデータベースが巨大になっていきます。また、データベースが壊れやすくなったり、動作が鈍くなることは当然あるでしょう。
つまり、小さな添付ファイルならいいのですが、大きなファイルを扱うような物には向いてないという事ですね。
じゃ、データベースをSqlserverにすればいいのか?
それはよくわかりませんが、やっぱりデータベースに添付ファイル自体を埋め込んでしまうような使い方には様々な問題が想定できます。
ファイルを 別の場所においてリンク先だけをデータベースに保存するというような方法もあるようですが、Sqlserverの場合は、それがFILESTREAMだったので難しくて断念でした。