C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[6]: C#でのDAOの利用


(過去ログ 135 を表示中)

[トピック内 8 記事 (1 - 8 表示)]  << 0 >>

■79852 / inTopicNo.1)  C#でのDAOの利用
  
□投稿者/ kys31 (1回)-(2016/05/23(Mon) 20:03:41)

分類:[C#] 

C#でのDAOの利用についての質問になります。

環境は以下になります。
Windows10 32bit
VisualStudio2015 Professional
VisualC# 2015

VB6で作成されていたアプリケーションをC#にマイグレーションしています。
その中でDAOを使用して.mdbファイルを作成しているのですが、うまくマイグレーション出来ません。

TableDef tDef = db.CreateTalbeDef("table");
tDef.Fields.Append(tDef.CreateField("xxxx"), DataTypeEnum.dbInteger);

Index idx = tDef.CreateIndex("aaaa");
idx.Fields.Append(idx.CreateField("bbbb"); ←★

★の箇所で「'Object'に'Append'の定義が含まれておらず、型'Object'の最初の引数を受け付ける拡張メソッド'Append'が見つかりませんでした。」とコンパイルエラーが出ます。

参照設定には「Microsoft DAO 3.6 Object Librari」を追加しています。
また、Accessのランタイムライブラリーをインストールして、「Microdsoftoffice 16.0 Object Library」を追加してみても同じエラーが発生しました。

確かに、Index.FieldsはObject型なので当然のエラー結果だと思いますが、回避方法ありませんでしょうか?
そもそも、今の環境ではDAOを使用することは不可能なのでしょうか?

初心者のため全く分からない状態です。ご教授お願い致します。



引用返信 編集キー/
■79853 / inTopicNo.2)  Re[1]: C#でのDAOの利用
□投稿者/ 魔界の仮面弁士 (721回)-(2016/05/23(Mon) 20:38:59)
2016/05/23(Mon) 20:51:28 編集(投稿者)

No79852 (kys31 さん) に返信
> TableDef tDef = db.CreateTalbeDef("table");
スペルミス?

> tDef.Fields.Append(tDef.CreateField("xxxx"), DataTypeEnum.dbInteger);
Fields.Append に、引数 は 1 つしかありません。
TableDef.CreateField の引数と混同していませんか?


Fields fields = tDef.Fields;
Field field = tDef.CreateField("xxxx", DataTypeEnum.dbInteger);
fields.Append(field);

// COM コンポーネントなので、Marshal.ReleaseComObject で解放
if(Marshal.IsComObject(field)) Marshal.ReleaseComObject(field);
if(Marshal.IsComObject(fields)) Marshal.ReleaseComObject(fields);


> Index idx = tDef.CreateIndex("aaaa");
> idx.Fields.Append(idx.CreateField("bbbb"); ←★

そもそも、括弧の数が合わないような…?


> ★の箇所で「'Object'に'Append'の定義が含まれておらず、型'Object'の最初の引数を受け付ける拡張メソッド'Append'が見つかりませんでした。」とコンパイルエラーが出ます。
> 確かに、Index.FieldsはObject型なので当然のエラー結果だと思いますが、回避方法ありませんでしょうか?

Index の Files プロパティは Variant 型であるため、C# では Object 型になっています。
C# から利用する場合は、dynamic または IndexFields にキャストする必要があります。

IndexFields fs = (IndexFields)idx.Fields;
fs.Append(field);


> そもそも、今の環境ではDAOを使用することは不可能なのでしょうか?
DAO で生成するかわりに、"CREATE TABLE" 等の SQL を実行するという手もあります。


> 参照設定には「Microsoft DAO 3.6 Object Librari」を追加しています。

スペルミスはさておき、そのライブラリの利用は望ましくありません。

その場合、Interop.Dao.dll の IA が自動生成され、
それが参照されることになります。
公式にテストされたものではありませんので、
使うのであれば、PIA 版の "DAO.DLL" を採用しましょう。
http://msdn.microsoft.com/ja-jp/library/15s06t57.aspx
http://msdn.microsoft.com/ja-jp/library/cc375821.aspx

2015 の参照マネージャーであれば、
[アセンブリ]-[拡張]-[dao] から指定できると思います。
引用返信 編集キー/
■79854 / inTopicNo.3)  Re[2]: C#でのDAOの利用
□投稿者/ kys31 (2回)-(2016/05/23(Mon) 21:07:01)
No79853 (魔界の仮面弁士 さん) に返信
> 2016/05/23(Mon) 20:51:28 編集(投稿者)

魔界の仮面弁士さん、ご回答ありがとうございます。

>>TableDef tDef = db.CreateTalbeDef("table");
> スペルミス?

申し訳ありません。
TableDef tDef = db.CreateTableDef("table");


>>tDef.Fields.Append(tDef.CreateField("xxxx"), DataTypeEnum.dbInteger);
> Fields.Append に、引数 は 1 つしかありません。
> TableDef.CreateField の引数と混同していませんか?

こちらも申し訳ありません。記載ミスでした。
tDef.Fields.Append(tDef.CreateField("xxxx", DataTypeEnum.dbInteger));
が正しいものになります。


>>Index idx = tDef.CreateIndex("aaaa");
>>idx.Fields.Append(idx.CreateField("bbbb"); ←★
>
> そもそも、括弧の数が合わないような…?

申し訳ありません。
idx.Fields.Append(idx.CreateField("bbbb"));
になります。


> Index の Files プロパティは Variant 型であるため、C# では Object 型になっています。
> C# から利用する場合は、dynamic または IndexFields にキャストする必要があります。
>
> IndexFields fs = (IndexFields)idx.Fields;
> fs.Append(field);

IndexFieldsという型がVisualStusio上での候補に出てきません。
何か参照設定等が足りないのでしょうか?


> スペルミスはさておき、そのライブラリの利用は望ましくありません。
>
> その場合、Interop.Dao.dll の IA が自動生成され、
> それが参照されることになります。
> 公式にテストされたものではありませんので、
> 使うのであれば、PIA 版の "DAO.DLL" を採用しましょう。
> http://msdn.microsoft.com/ja-jp/library/15s06t57.aspx
> http://msdn.microsoft.com/ja-jp/library/cc375821.aspx
>
> 2015 の参照マネージャーであれば、
> [アセンブリ]-[拡張]-[dao] から指定できると思います。

ご指摘ありがとうございます。
ただ、[アセンブリ]-[拡張]-[dao]が存在しません。
[アセンブリ]-[拡張]-[Interop.DAO]なら存在しますが、それで良いでしょうか?
引用返信 編集キー/
■79855 / inTopicNo.4)  Re[3]: C#でのDAOの利用
□投稿者/ 魔界の仮面弁士 (722回)-(2016/05/23(Mon) 22:00:52)
No79854 (kys31 さん) に返信
>>IndexFields fs = (IndexFields)idx.Fields;
>>fs.Append(field);
>
> IndexFieldsという型がVisualStusio上での候補に出てきません。

不可視属性付きの型のため、IntelliSense には表示されません。
直接入力してください。

正しく宣言されれば、IndexFields という語が
黒文字ではなく水色で表示されるはずです。



> 何か参照設定等が足りないのでしょうか?

うまくいかない場合は、名前空間も含めて指定して見てください。
PIA 版の DAO を参照設定していれば、dao 名前空間にあるはずです。

PIA ではなく自動生成されたものの場合、Dao あるいは DAO という
名前空間になることもあります。

dao.IndexFields a;
Dao.IndexFields b;
DAO.IndexFields c;


> ただ、[アセンブリ]-[拡張]-[dao]が存在しません。
> [アセンブリ]-[拡張]-[Interop.DAO]なら存在しますが、それで良いでしょうか?

PIA がインストールされていない状態なのだと思います。
Office をカスタムセットアップし、".NET プログラミング サポート" 機能を有効にしてください。

Office をお持ちで無い場合は、Download Center から PIA を入手できます。
http://www.hanatyan.sakura.ne.jp/vbnetbbs/wforum.cgi?no=10745&reno=10743&oya=10703&mode=msgview&page=0
引用返信 編集キー/
■79859 / inTopicNo.5)  Re[4]: C#でのDAOの利用
□投稿者/ kys31 (3回)-(2016/05/24(Tue) 11:55:45)
No79855 (魔界の仮面弁士 さん) に返信

度々のご回答ありがとうございます。

> 不可視属性付きの型のため、IntelliSense には表示されません。
> 直接入力してください。
> 正しく宣言されれば、IndexFields という語が
> 黒文字ではなく水色で表示されるはずです。

試しに、IndexFieldsを入力してみたら水色表示になりました。
ただし、名前空間がDAOになってしまいました。
そこで教えていただいたOffice2010 PIAをインストールしてみたのですが
やはり、[アセンブリ]-[拡張]-[dao]が存在しません。

今になって気がついたのですが、試行錯誤している途中にAccess2016のランタイムライブラリーをインストールしていて
[COM]-[タイプライブラリ]-[Microsoft Office 16.0 Access Database Engine Object Library]が存在し追加してみると
「Microsoft.Office.Interop.Access」が追加されました。

また、教えていただいたURLにPIAの名前一覧が記載されており
その中に「Microsoft.Office.Interop.Access.dll」がありますが
先程の追加した参照のプロパティのパスが同じ名前のdllになっていました。

https://msdn.microsoft.com/ja-jp/library/15s06t57.aspx

これはPIA版のdllではないのでしょうか?


度々お手数おかけいたしますが、ご教授お願い致します。
引用返信 編集キー/
■79860 / inTopicNo.6)  Re[5]: C#でのDAOの利用
□投稿者/ kys31 (4回)-(2016/05/24(Tue) 12:10:40)


> これはPIA版のdllではないのでしょうか?

申し訳ありません。記載していただいたのURLのなかに以下の記載があり
参照に追加したものとバージョンは違いましたが、同じもののようでした。

==============================
以下は GAC に登録された物
------------------------------
C:\Windows\assembly\GAC_MSIL\Microsoft.Office.Interop.Access.Dao\14.0.0.0__71e9bce111e9429c\Microsoft.Office.interop.access.dao.dll
 ファイルの説明: Microsoft.Office.Interop.Access.Dao
 製品名: Microsoft Office 2010
 ファイル更新日: 2011/10/11 19:40:24
 ファイルバージョン: 14.0.4760.1000
 アセンブリバージョン: 14.0.0.0
 ランタイム: v2.0.50727

そして、これはaccdb にも対応した DAO 12.0 (Access Database Engine 12.0)になるということですね。

そこで教えていただいたOffice2010 PIAをインストールして
[アセンブリ]-[拡張]-[dao]が存在しないのが気になりますが。
引用返信 編集キー/
■79862 / inTopicNo.7)  Re[5]: C#でのDAOの利用
□投稿者/ 魔界の仮面弁士 (723回)-(2016/05/24(Tue) 14:12:03)
No79859 (kys31 さん) に返信
> 試しに、IndexFieldsを入力してみたら水色表示になりました。
で、動作しましたか?


> その中に「Microsoft.Office.Interop.Access.dll」がありますが
> 先程の追加した参照のプロパティのパスが同じ名前のdllになっていました。

既に自己レスいただいておりますが、それも PIA です。

ただし、当初の DAO 3.6 とは異なるバージョンでして、
DAO 12.0 や ACEDAO と呼ばれるものです。

Recordset2 などの新機能はありますが、機能的には互換性があります。
古い機能は傷られたりもしていますが。

DAO 3.6 との最大の違いは、64bit版をサポートしていることです。
(ただし既定では、32bit版がインストールされるようになっています)


注意点として、異なるバージョンの DAO ライブラリを同時にロードしないように
してください。今回のケースであれば、3.6 か 12.0 のいずれかを利用するようにします。
引用返信 編集キー/
■79863 / inTopicNo.8)  Re[6]: C#でのDAOの利用
□投稿者/ kys31 (5回)-(2016/05/24(Tue) 14:30:31)
No79862 (魔界の仮面弁士 さん) に返信

>>試しに、IndexFieldsを入力してみたら水色表示になりました。
> で、動作しましたか?

失礼いたしました。
目的の動作をするようになりました。


> 既に自己レスいただいておりますが、それも PIA です。
> ただし、当初の DAO 3.6 とは異なるバージョンでして、
> DAO 12.0 や ACEDAO と呼ばれるものです。
> Recordset2 などの新機能はありますが、機能的には互換性があります。
> 古い機能は傷られたりもしていますが。
> DAO 3.6 との最大の違いは、64bit版をサポートしていることです。
> (ただし既定では、32bit版がインストールされるようになっています)

承知致しました。
せっかくなので、こちらの方を利用するように致します。
(最初に教えていただいた、参照設定が何故かどうしても出来ないので、、、)


> 注意点として、異なるバージョンの DAO ライブラリを同時にロードしないように
> してください。今回のケースであれば、3.6 か 12.0 のいずれかを利用するようにします。

承知致しました。
元々参照していた「Microsoft DAO 3.6 Object Library」は外して
「Microsoft.Office.Interop.Access.Dao」のみ残すようにしました。


色々とご教授していただき、本当にありがとうございました。
自力ではどうにもできない状況でしたので、本当に助かりました。
また何かの機会がありましたら、よろしくお願い致します。


解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -