🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

Q&A

解決済

2回答

7658閲覧

Accessからリンクテーブルのレコードを全件削除したい

chimi_mamire

総合スコア12

SQL Server

SQL Serverはマイクロソフトのリレーショナルデータベース管理システムです。データマイニングや多次元解析など、ビジネスインテリジェンスのための機能が備わっています。

Access

Accessはマイクロソフトによるリレーショナルデータベース管理システムです。オブジェクト指向のアプリケーション作成に対応しており、テーブルや編集をはじめ、クエリ生成、入力フォーム作成、レポート作成など一通りの機能を備えています。

0グッド

0クリップ

投稿2019/11/28 02:08

編集2019/12/03 01:36

前提・実現したいこと

Accessのフォームにあるボタンを押下する

→リンクテーブル内にあるレコードを全件削除

発生している問題・エラーメッセージ

下記のソースコードで実行すると、

"実行時エラー'3086' 指定されたテーブルから削除できませんでした"

と表示され、SQL文のところでデバックが止まります。

エラーで調べてみたのですが、調べ方が悪く解決できておりません。

もし原因・解決方法をご存じでしたら、何卒ご教示お願いいたします。

該当のソースコード

FormAのボタンをクリック

→LinkTableのレコードが全件削除される

→formBが開く

といった流れにしています。

Private Sub OpenFormB_Click() Dim Con As New ADODB.Connection Dim strConnectionStr As String strConnectionStr = "Provider=SQLOLEDB; " & _ "Data Source=(サーバー名); " & _ "Initial Catalog=(DB名); " & _ "USER ID= (ユーザー名); " & _ "PASSWORD= (パスワード); " With Con .ConnectionString = strConnectionStr .Open Dim DB As Database Set DB = CurrentDb db.Execute ("DELETE FROM LinkTable;") Set DB = Nothing .Close End With Set Con = Nothing DoCmd.OpenForm "FormB", acNormal, "", "", , acNormal End Sub

PrimaryKey追加後

以下のコードで動作確認できました

Private Sub OpenFormB_Click() Dim Con As Connection Dim RST As New ADODB.Recordset Set Con = CurrentProject.Connection Set RST = New ADODB.Recordset With RST .Open "LinkTable", Con, , adLockOptimistic Do Until .EOF .Delete .MoveNext Loop RST.Close Con.Close End With Set RST = Nothing Set Con = Nothing DoCmd.OpenForm "FormB", acNormal, "", "", , acNormal End Sub

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sazi

2019/11/28 13:26 編集

何をリンクしているのでしょう? データベースのテーブルですか? エクセルだったり、CSVだったりしますか?
chimi_mamire

2019/11/29 01:01

データベースのテーブルとリンクしています。
guest

回答2

0

ベストアンサー

そのリンク先のテーブルにはプライマリーキーが無かったりしませんか?
プライマリーキーの無いテーブルは読み取り専用です。

データ自体は一意という事なら、疑似インデックスを作成すると削除できたはずです。
CREATE INDEX ステートメント

投稿2019/11/28 13:32

sazi

総合スコア25327

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimi_mamire

2019/11/29 01:19

インデックスを作成したところ、リンクテーブルから直での編集は可能になりました! ありがとうございます!
guest

0

リンクテーブルのデータを削除したいということですよね。

ADODB.Connection を生成してますが、それらのコードは不要では。
提示のコードでは、DAOで削除クエリを実行してますので。

下記のコードだけでOKのはずです。

vba

1Private Sub OpenFormB_Click() 2 3 Dim DB As DAO.Database 4 Set DB = CurrentDb 5 6 db.Execute ("DELETE FROM LinkTable;") 7 Set DB = Nothing 8 9 DoCmd.OpenForm "FormB", acNormal, "", "", , acNormal 10 11End Sub

上記で同じエラーがでるなら、
クエリを新規作成して、SQLビューにして、

sql

1DELETE FROM LinkTable;

と記述して実行してみてください。

それでエラーなく削除できるか確認してみてください。

投稿2019/11/28 05:40

hatena19

総合スコア34073

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

chimi_mamire

2019/11/28 07:40

回答ありがとうございます。 上記のコードとクエリ両方とも試してみましたが、やはり同様のエラーメッセージが発生しました。
hatena19

2019/11/28 07:45

クエリで実行してもエラーが出るということは、コードの問題ではなく、リンクテーブルに問題があるということです。 リンクテーブルを直接開いて、更新とかレコードの削除はできますか。 もし、それもできないのなら、 リンクテーブル接続の設定、リンク先のデータベースの設定に問題かありますので、 それを確認してください。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問