質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Access

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

Q&A

解決済

1回答

5054閲覧

CompactDB データベースの形式 を認識できません

Sitapper

総合スコア26

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Access

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

0グッド

0クリップ

投稿2020/03/09 08:31

度々恐れ入ります。

あるプログラムで定期的にAccessDB(accdb)を最適化するのですが、
失敗してしまいます。

検証のため、最適化部分のみ抽出した雑プログラムを作成しました。

実行してみると
「データベースの形式 'test.accdb' を認識できません。」
となります。

何が間違っているでしょうか?
他にやりようがありますでしょうか?

どうかよろしくお願いします。

環境は、
・実行:Win10 Pro Ver.10.0.18363(build 18363)、
・開発:Visual Studio2019 .NET Framework 4.7.2、
・AccessRuntime:2013
です。

プログラムは参照マネージャの COM に
・Micorosoft DAO 3.6 Object Library 5.0
が指定されています。

ビルドプラットフォームは x86 です。

test.accdb は Access 2007 や 2010 で作成したテスト用DBで、
UserID, UserName という文字列項目2列持つ Table1 テーブルがあり、
{"User1":"AAA", "User2":"BBB"}というデータを格納しています。

using System; using System.Windows.Forms; namespace test { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void button1_Click(object sender, EventArgs e) { string source = @".\Data\test.accdb"; string target = @".\Data\tmp_test.accdb"; CompactMDB(source, target); } public static void CompactMDB(string source, string target) { DAO.DBEngine eng = null; try { eng = new DAO.DBEngine(); eng.CompactDatabase(source, target); } catch(Exception ex) { string s = ex.Message; MessageBox.Show(s); } finally { eng = null; } } } }

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/03/09 09:00

.NET Framework のアプリですよね? ACE + OleDb + ADO.NET を使わないのには何か理由があるのでしょうか?
退会済みユーザー

退会済みユーザー

2020/03/09 09:03

表題の「CompactDB データベースの形式 を認識できません」は不適切です。CompactDB というのは削除してください。
Sitapper

2020/03/09 10:26

SurferOnWww さま 前回もありがとうございます。度々本当にすみません。 ACE + OleDb + ADO.NET を使わない理由ですが、特にありません。 と申しますか、既存のシステムなのですが、Win7からWin10に移行後動作しなくなり、そのメンテナンスをしています。 実はOSが変わっただけでなく、いろいろな要因があるのかも知れません。 とにかく一刻も早く動作するように、とのことで、既存のプログラムを元に質問させていただいた次第です。 正直申し上げれば、ACE + OleDb + ADO.NET の仕組みもよくは理解していません。 しかし、きっとその仕組みを用いるのが普通なのでしょう。 Google検索をしてみますと、 <https://www.oborodukiyo.info/ADONET/VS2017/ADONET-HowToAccessAccessDB> のようなサンプルがあり、なるほど既存システムのプログラムより分かりやすいようです。 既存システムのプログラムではDBにアクセスしている箇所がいろいろとあるようで、 今後こういった方法できちんと作り直していければと思っていますが、 とりあえず今はDBの最適化を行う必要があります。 上記URLのサンプルを動かしてDBから値が取得できることは確認できましたが、 DB最適化への応用がまだできずにいます。 もしよろしければ何かヒントいただければありがたいです。 ACE + OleDb + ADO.NETの方法について、もう少し調べてみようと思います。 ありがとうございました。
sazi

2020/03/09 10:39

その最適化対象のファイルをaccessのメニューからの最適化を実行した場合にはエラーにはならないのでしょうか?
Sitapper

2020/03/09 10:50

ありがとうございます。 Access2010の「ファイル」-[データベースの最適化/修復]ボタン を実行したところ、 エラー無く終了しました。
guest

回答1

0

ベストアンサー

最適化はAccess自身のコマンドですから、対象ファイルに接続してなんとかしようとするのは変な話です。
コマンドラインだと以下のようになります。

MSACCESS.EXE ファイル名 /compact

Shell関数などで起動するようにすると良いかと思います。

但しランタイム版が最適化のコマンドを受け付けるかどうかは定かではありません。

投稿2020/03/09 11:35

編集2020/03/09 11:37
sazi

総合スコア25327

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

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

Sitapper

2020/03/09 12:49

ありがとうございます。 今メンテしているシステムは、いろいろな端末に配られるのですが、 端末Aでは AccessRuntime2013 で、別の端末では AccessRuntime2010 のように、 配布先によって AccessRuntime のバージョンが異なる可能性があります。 この MSACCESS.EXE ですが、私のワークマシンでは、 "C:\Program Files (x86)\Microsoft Office\root\Office16" に入っていたのですが、 今メンテしているシステムをいろいろな端末に配る際に同梱したとして、 異なるバージョンの AccessRuntime が入っている端末で動作するものでしょうか。 今メンテしているシステムの実行ファイルが MySystem.exe で C:\MySystem に入れるとして、 MSACCESS.EXE を CompactDB.exe のようにリネームして同じフォルダに入れようと思います。 MySystem.exe から CompactDB.exe(MSACCESS.EXE をリネームしたもの)を呼ぶようにしようと思います。
Sitapper

2020/03/09 23:38

ありがとうございました。 今回は、SurferOnWww さまの ACE + OleDb + ADO.NET とのコメントをヒントにいろいろ検索し、 DAOを使ってやっていこうと思います。 これでうまくいかなければ MSACCESS.EXE を使おうと思います。 いろいろな方から参考になるコメントをいただきましたが、 とにかく知識不足なので、これを機にDBアクセスまわりの勉強をしたいと思います。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問