Доступ к свойствам MSAccess без фактического открытия базы данных

Я пытаюсь получить доступ к свойствам MS Access, фактически не открывая базу данных.

Вот код для лучшего понимания:

var processStartInfo = new ProcessStartInfo(args[0]) 
    { 
        WindowStyle = ProcessWindowStyle.Hidden, 
        CreateNoWindow = true
    };

Process.Start(processStartInfo);

application = (Access.Application)Marshal.GetActiveObject("Access.Application");

dao.Property allowByPassKeyProperty = null;

foreach (dao.Property property in application.CurrentDb().Properties)
{
    if (property.Name == "AllowByPassKey")
    {
        allowByPassKeyProperty = property;
        break;
    }
}

Моя проблема в том, что в этом случае я открываю базу данных, чтобы искать свойства (application.CurrentDb().Properties), и запускается материал запуска MS Access.

Я хочу избежать всего, что связано с запуском, и просто ввести правильное значение для свойства.

Можно ли просмотреть свойства, возможно, с отражением и поздним связыванием, например: http://www.codeproject.com/KB/database/mdbcompact_latebind.aspx?

Или есть другой вариант добиться того, чего я хочу?


person Egi    schedule 10.02.2011    source источник
comment
С помощью API можно имитировать клавишу Shift, которая останавливает запуск, но я понятия не имею, как это впишется в С#: mvps.org/access/api/api0068.htm   -  person Fionnuala    schedule 11.02.2011
comment
@ Рему. да, это возможно, но в этом нет никакой пользы, потому что мне нужна программа, которая может активировать и деактивировать обходной ключ (сдвиг). и как только я деактивировал его, симуляция не помогла бы.   -  person Egi    schedule 14.02.2011


Ответы (2)


Извините, у меня нет подробностей, но я изучаю использование DAO для открытия базы данных Access (при условии, что это до 2007 года). DAO — это собственный код доступа/реактивного доступа, поэтому вам не нужно фактически запускать все приложение Access.

Один старый код VB.Net (да, .Net), который у меня лежит:

m_oEngine = New DAO.DBEngine

m_oEngine.SystemDB = sWorkgroupFile

m_oWorkspace = m_oEngine.CreateWorkspace("My Workspace", sUserName, sPassword, DAO.WorkspaceTypeEnum.dbUseJet)

m_oDatabase = m_oWorkspace.OpenDatabase(sDatabaseFile, bExclusive, bReadOnly)  ' Note DAO docs say the second parameter is for Exclusive
person Tom Winter    schedule 10.02.2011
comment
DAO будет работать с ACCDB, а не только с MDB. Это собственная библиотека интерфейса для всех баз данных Access. Однако, если это ACCDB, вы должны использовать ACE, а не Jet 4. Действительно, если на вашем компьютере установлен ACE, лучше просто использовать его по умолчанию, так как он может работать с обоими. - person David-W-Fenton; 12.02.2011

На всякий случай, если кто-то работает с MS Access и ему нужна такая же программа, вот код.

Программа может переключать свойство AllowBypassKey в файлах MS Access *.mdb, *.mde. Протестировано только с MS Access 2003. Это может быть чрезвычайно полезно, если вы деактивировали свойство, а ваш макрос AutoExec сходит с ума.

namespace ToggleAllowBypassKey
{
    public class Program
    {
        private static DAO.DBEngine dbEngine;

        private static DAO.Database database;

        public static void Main(string[] args)
        {
            try
            {
                if (args.Length == 0)
                {
                    Console.WriteLine("Please enter an MS Access application path as a parameter!");
                    return;
                }

                dbEngine = new DAO.DBEngine();
                database = dbEngine.OpenDatabase(args[0]);

                DAO.Property allowBypassKeyProperty = null;

                foreach (dao.Property property in database.Properties)
                {
                    if (property.Name == "AllowBypassKey")
                    {
                        allowBypassKeyProperty = property;
                        break;
                    }
                }

                if (allowBypassKeyProperty == null)
                {
                    allowBypassKeyProperty = database.CreateProperty("AllowBypassKey", DAO.DataTypeEnum.dbBoolean, false, true);
                    database.Properties.Append(allowBypassKeyProperty);
                    Console.WriteLine("AllowBypassKey Property has been added. It's Value is '" + allowBypassKeyProperty.Value + "'");
                }
                else
                {
                    allowBypassKeyProperty.Value = !allowBypassKeyProperty.Value;
                    Console.WriteLine("AllowBypassKey set to '" + allowBypassKeyProperty.Value + "'!");
                }
            }
            catch(Exception exception)
            {
                Console.WriteLine("Exception Message: " + exception.Message);
                Console.WriteLine("Inner Exception:" + exception.InnerException);
            }
            finally
            {
                database.Close();
                System.Runtime.InteropServices.Marshal.ReleaseComObject(database);
                database = null;

                System.Runtime.InteropServices.Marshal.ReleaseComObject(dbEngine);
                dbEngine = null;

                Console.WriteLine();
                Console.WriteLine("Press enter to continue ...");
                Console.ReadLine();
            }
        }
    }
}

person Egi    schedule 15.02.2011