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

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

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

Re[4]: DAOのコンストラクタが使用不可


(過去ログ 106 を表示中)

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

■63481 / inTopicNo.1)  DAOのコンストラクタが使用不可
  
□投稿者/ asuka (4回)-(2012/08/31(Fri) 17:08:08)

分類:[C#] 

お世話になっております。
下記サイトを参考にDAOを使用しています。(Microsoft DAO 3.6 Object Library参照に追加)
http://onestep.air-nifty.com/blog/2006/12/caccessmdb_dao_8ff7.html


コンパイルすると1行目でエラーになります。
DAO.DBEngine engine = new DAO.DBEngineClass();
「型 'DAO.DBEngineClass' のコンストラクターが定義されていません。」


Silverlight WSプログラムだからかと思い、Windowsフォームで試しましたところ、
同じエラーが発生しました。
何がいけないのでしょうか?
コンストラクタを右クリックして定義へ飛ぶとメタデータですがコンストラクタの定義はされていました。
namespace DAO
{
[Guid("00000100-0000-0010-8000-00AA006D2EA4")]
[TypeLibType(15)]
[ClassInterface(0)]
public class DBEngineClass : _DBEngine, DBEngine
{
public DBEngineClass();


ご教授頂けると幸いです。



下記サイトにてMicrosoft.Office.Interop.Access.Daoを使う方法もあったので試しました。
http://blogs.bitlan.net/ito/?p=351

エラーは若干違いましたが同じ意図でした。
「型 'Microsoft.Office.Interop.Access.Dao.DBEngineClass' のコンストラクターが定義されていません。」

引用返信 編集キー/
■63482 / inTopicNo.2)  Re[1]: DAOのコンストラクタが使用不可
□投稿者/ 魔界の仮面弁士 (40回)-(2012/08/31(Fri) 17:26:40)
No63481 (asuka さん) に返信
> コンパイルすると1行目でエラーになります。
> DAO.DBEngine engine = new DAO.DBEngineClass();
> 「型 'DAO.DBEngineClass' のコンストラクターが定義されていません。」
AnyCPU ビルド+64bit環境での動作ということは無いでしょうか。
DAO 3.6 は32bit 版のみで、64bit からは ACEDAO 12.0 以上が必要なはず。

それで駄目なら、Activator.CreateInstance 経由で
DBEngine のインスタンスを生成してみるのはどうでしょう。


> ご教授頂けると幸いです。
http://www.tt.rim.or.jp/~rudyard/torii009.html
http://blogs.wankuma.com/jeanne/archive/2005/11/24/19566.aspx
引用返信 編集キー/
■63485 / inTopicNo.3)  Re[2]: DAOのコンストラクタが使用不可
□投稿者/ asuka (6回)-(2012/08/31(Fri) 18:25:01)
> AnyCPU ビルド+64bit環境での動作ということは無いでしょうか。
> DAO 3.6 は32bit 版のみで、64bit からは ACEDAO 12.0 以上が必要なはず。

早速のご回答ありがとうございます。
ご指摘の通りまさしくその環境です。


> それで駄目なら、Activator.CreateInstance 経由で
> DBEngine のインスタンスを生成してみるのはどうでしょう。

Activator.CreateInstanceというのものを初めて耳に(目に?)しました。
調べてみたいと思います。


あれやこれやいじって無理やりクラス名と同じ名前をコンストラクタにしたらコンパイルは通りました。
×DAO.DBEngine engine = new DAO.DBEngineClass()
○DAO.DBEngine daodbengine = new DAO.DBEngine();

メタデータですが、DBEngineClassコンストラクタは引数なし、オーバーライドなしで何もしないようですので、
これで問題がなければこのままで行こうかと思っていました。
こういうプログラミングはよろしくないとは思いますが…


>>ご教授頂けると幸いです。
> http://www.tt.rim.or.jp/~rudyard/torii009.html
> http://blogs.wankuma.com/jeanne/archive/2005/11/24/19566.aspx

ご指導ご鞭撻のほどよろしくお願いします。
でしたら問題ないですかね? ^^;

そういえば「ご冥福を祈ります」と言った言葉は定着してしまっていますが、
冥福は本来祈るものではない、みたいな言い回しを思い出しました。
ニホンゴムズカシイデス、アリガトウゴザイマシタ。


引用返信 編集キー/
■63488 / inTopicNo.4)  Re[3]: DAOのコンストラクタが使用不可
□投稿者/ 魔界の仮面弁士 (43回)-(2012/08/31(Fri) 21:22:06)
No63485 (asuka さん) に返信
>> AnyCPU ビルド+64bit環境での動作ということは無いでしょうか。
>> DAO 3.6 は32bit 版のみで、64bit からは ACEDAO 12.0 以上が必要なはず。
> ご指摘の通りまさしくその環境です。
AnyCPU のまま実装するなら、ACEDAO.DLL の 64bit 版が必要です(参照設定も変更)。
DAO 3.6 のままとする場合は、x86 ビルドに変更してみてください。


>>それで駄目なら、Activator.CreateInstance 経由で
>>DBEngine のインスタンスを生成してみるのはどうでしょう。
> Activator.CreateInstanceというのものを初めて耳に(目に?)しました。
> 調べてみたいと思います。

VB でいうところの CreateObject、JScript でいうところの new ActiveXObject みたいな機能です。

以下サンプルです。参照設定なしで動作するよう dynamic を利用していますので、
VS2010 以上が必要となります。VS2008 以下の C# を利用している場合は、
それぞれを DAO の対応する型に置き換えてください。


using System;
using System.IO;
using System.Runtime.InteropServices;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main()
        {
            if (IntPtr.Size == 8)
            {
                Console.WriteLine("64bit環境には非対応です。");
                return;
            }
            
            const string dbLangJapanese = ";LANGID=0x0411;CP=932;COUNTRY=0";
            string newMdb = @"C:\temp\sample.mdb";

            // dynamic de = Activator.CreateInstance(
            //    Type.GetTypeFromProgID("DAO.DBEngine.120"));

            dynamic de = Activator.CreateInstance(
                Type.GetTypeFromProgID("DAO.DBEngine.36"));

            dynamic wss = de.Workspaces;
            dynamic ws = wss[0];

            System.IO.File.Delete(newMdb);
            dynamic db = ws.CreateDatabase(newMdb, dbLangJapanese);

            string sql = "CREATE TABLE TEST ( COL1 Integer PRIMARY KEY )";

            db.Execute(sql);

            db.Close();

            Marshal.ReleaseComObject(db);
            Marshal.ReleaseComObject(ws);
            Marshal.ReleaseComObject(wss);
            Marshal.FinalReleaseComObject(de);
        }
    }
}


> あれやこれやいじって無理やりクラス名と同じ名前をコンストラクタにしたらコンパイルは通りました。
コンパイルが通ったとしても、64bit + DAO3.6 の環境はサポートされないため、
実行時にインスタンスを生成できないと思います。

DAO バージョンを切り替えるか、もしくは x86 ビルドへの変更が必要かと。


> ご指導ご鞭撻のほどよろしくお願いします。
> でしたら問題ないですかね? ^^;
掲示板は人を鍛える場ではないので、指導はともかく鞭撻はちょっと大げさな気も。(^^;


> そういえば「ご冥福を祈ります」と言った言葉は定着してしまっていますが、
> 冥福は本来祈るものではない、みたいな言い回しを思い出しました。
自分は浄土真宗大谷派なので、冥福を祈るという言い回しは使いませんが、
他人がそういう言い回しをしても気にはしませんね。


> ニホンゴムズカシイデス
プログラム言語も然り。でもそれが面白くもあり。

引用返信 編集キー/
■63546 / inTopicNo.5)  Re[4]: DAOのコンストラクタが使用不可
□投稿者/ asuka (7回)-(2012/09/05(Wed) 14:48:30)
魔界の仮面弁士さん

サンプルまで提示頂きありがとうございます。

64bit環境でaccdbファイルではなく、mdbファイルを操作したいというのが趣旨でした。

教えて頂きました通り、AnyCPUのまま以下のCOMを追加しました。
Microsoft Office 14.0 Access Database Engine Object Library(ACEDAO.DLL)

更にプロパティから相互運用型の埋込みをFalseにすることにより、
Microsoft.Office.Interop.Access.Dao.LanguageConstants列挙型を引数にそのまま指定することが可能になることが分かりました。

Ex.
dynamicdb = dynamicws.CreateDatabase(mdbfilepath,
      Microsoft.Office.Interop.Access.Dao.LanguageConstants.dbLangGeneral,
      Microsoft.Office.Interop.Access.Dao.DatabaseTypeEnum.dbEncrypt);


そしてdynamicが非常に使いやすかったです。

SQLサーバの任意のテーブルをMDBへ一気に作成する内容のコードを書いていました。

VB版からC#へ移行していたので、Daoが使えたのがとても助かりました。

同じことがしたい人のために簡単にコードを載せておきます。

string constring = string.Format("ODBC;Driver={0};Server={1};UID={2};PWD={3};Database={4};","SQL Server","ServerName", "sa", "","DBName");

dynamic dynamictb = dynamicdb.CreateTableDef("TableName",                  Microsoft.Office.Interop.Access.Dao.TableDefAttributeEnum.dbAttachSavePWD,
          "TableName",
          constring);
dynamicdb.TableDefs.Append(dynamictb);
dynamicdb.TableDefs.Append(dynamictb);



本当に助かりました。

ありがとうございます。m(__)m
解決済み
引用返信 編集キー/


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

このトピックに書きこむ

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

管理者用

- Child Tree -