This project has moved. For the latest updates, please go here.

Create new instance of a DAO.DbEngine

Jan 23, 2013 at 10:30 AM

Hi Sebastian,

folgendes

Dao.DBEngine dbe = new Dao.DbEngine()

führt zu der Fehlermeldung

progId not found DAO.DbEngine

Die inner-exception besagt

NetOffice.COMObject.CreateFromProgId(String progId)

Gibts hier keinen Standardkonstruktor oder eine Factorymethode ohne Parameter?

Oder mache ich was falsch?

Danke für die Hilfe.

 

Gruß

Gerhard



 


Coordinator
Jan 23, 2013 at 11:15 AM

Hallo

Auf die schnelle hab ich folgenden Topic gefunden:

http://support.microsoft.com/kb/157471/de

http://stackoverflow.com/questions/3892565/vb-net-dao-object-wont-create-dbengine

Es scheint so zu sein das die neuere DAO Version auf eine versionsspezifische ProgID besteht(sehr untypisch).
Die Angabe der Version in der ProgID sollte Abhilfe schaffen.

Dao.DBEngine dbe = new Dao.DbEngine("DAO.DBEngine.35")

Gruss
Sebastian

Jan 23, 2013 at 11:42 AM

Hallo,

ok, das war die Lösung, allerdings musste ich DAO.DBEngine.36 verwenden.

Jetzt verlangt Netoffice beim öffnen eines Recordsets, dass man NetOffice.Factory.Initialize() aufrufen soll. Das bringt leider auch nichst.

Anbie mal die entsprechende Methode. Vielleicht bin ich auch nur zu blöd....

 

 

 public static DataTable GetDataTableFromAccessQuery(string pathMdb, string queryName)
        {
            DataTable dt = new DataTable();
            if (File.Exists(pathMdb))
            {
                Dao.Recordset rs = null;
                Dao.Database db = null;
                Dao.DBEngine dbe = null;

                
                try
                {
                    NetOffice.Factory.Initialize();                 
                    dbe = new Dao.DBEngine("DAO.DBEngine.36");                   
                    db = dbe.OpenDatabase(pathMdb, Type.Missing, false, "");                   
                    rs = db.OpenRecordset(queryName, Dao.Enums.RecordsetTypeEnum.dbOpenSnapshot, 0, Dao.Enums.LockTypeEnum.dbOptimistic);
                    if(rs != null)
                        dt = RecordsetBridge.RecordsetBridge.ConvertRecordsetToDataTable(rs);
                }
                catch (Exception ex)
                {
                    throw new ArgumentException(ex.ToString());
                }
                finally
                {
                    if (rs != null)
                    {
                        rs.Close();
                        rs.Dispose();
                        //System.Runtime.InteropServices.Marshal.ReleaseComObject(rs);
                    }
                    if (db != null)
                    {
                        db.Close();
                        db.Dispose();
                        //System.Runtime.InteropServices.Marshal.ReleaseComObject(db);                     
                    }                    
                    if(dbe != null)
                        dbe.Dispose();                        
                    rs = null;
                    db = null;
                    dbe = null;

                }
            }

            return dt;
        }
Jan 23, 2013 at 12:07 PM

Hallo,

ich glaube das liegt daran, dass ich die Assemblies mit einer eigenen Signatur kompiliert habe. Die Originalassemblies funktionieren.

Die KeyToken.txt müsste ich wohl zum signieren verwenden, oder? Sorry, aber bei uns ist das nicht so einfach. Leider darf ich nur von uns signierte Assemblies verwenden.

Danke für die Hilfe.

 

Gruß

Gerhard





 

Coordinator
Jan 23, 2013 at 12:14 PM

Ja die Signatur ist wichtig, die NetOffice.dll sucht zur Laufzeit nach Assemblies mit diesen Signaturen. Wenn NetOffice einen nativen COM Proxy in die Hände kriegt z.B. die Rückgabe von dbe.OpenDatabase wird dieser Proxy untersucht und in den signierten NetOffice Assemblies nach dem korrespondieren Wrapper gefahndet, der Proxy in einer neuen Instanz dieser Klasse verpackt und zurückgegeben. Was du tun kannst ist die KeyTokens.txt zu modifizieren und die NetOffice.dll damit nochmals zu kompilieren.

Gruss
Sebsatian

Jan 23, 2013 at 4:11 PM

 

Hallo Sebastian,

sorry, aber ich habe keinen blassen Schimmer, wie ich die KeyToken.txt in meine Signierungsdatei bekomme, bzw. wie ich aus der KeyToken.txt eine Signierungsdatei erstelle. Vielleicht kannst Du mir ja einen Tipp geben. In der Zwischenzeit google ich ein wenig.

Vielen Dank.

Gerhard

Jan 23, 2013 at 4:33 PM

Hallo,

 

ok, ich bin wohl überarbeitet. Die KeyToken.txt ist embedded, dh. ich müsste die PublicKeyTokens entsprechend anpassen. Diese müsste dann bei den Dateieigenschaften der DLL in den Deteils der digitalen Signatur unter Seriennummer stehen, richtig?

 

Danke.

 

Gruß

Gerhard

 

Jan 23, 2013 at 4:47 PM

 

Hallo nochmal,

das mit der Seriennummer ist natürlich Schwachsinn. sn -T <Dllname>.dll.

Ok, ich probiere das dann morgen aus. Am meisten lernt man, wenn man selbst drauf kommt.

Schöne Woche noch.

Herzlichst

Gerhard

Jan 24, 2013 at 8:06 AM

Hallo Sebastian,

ok, hat alles funktioniert.

Gruß

Gerhard