Как я распределяю обновления фронтэнда базы данных Access?

У меня есть база данных Access 2007, которую я разработал который подключения к SQL Server для фактического хранения данных. Я использовал Мастер Решения для Пакета для создания распространяемого установщика, который включал время выполнения доступа (с файлом ACCDE), который я обошел и установил приблизительно на 15 ПК. Так или иначе мой вопрос, что лучший способ состоит в том, чтобы распределить обновления этой базы данных? Прямо сейчас я должен был бы обойти и удалить и переустановить. Это не проблема... Я просто задавался вопросом, было ли иначе.

Я попытался оставить фронтэнд на сетевом ресурсе, но кажется, что большинство людей предлагает хранить фронтенд на локальной машине, которая имеет смысл. Проблемы, с которыми я столкнулся, когда я оставляю его на сетевом ресурсе (по крайней мере, с Доступом 2003 mdbs) состоят в том, что я нуждаюсь к компактному и часто восстанавливаю, и я также должен уничтожить открытые заседания (пользователь, у кого есть открытый файл) при обновлении. Я предположил бы, что это могло также гипотетически создать ненужное узкое место, если бы пользователь не был в локальной сети.

8
задан Brett G 5 February 2010 в 00:06
поделиться

3 ответа

Автоматизация внешнего распределения - тривиальная задача. Это проблема, которую неоднократно решали. http://autofeupdater.com Тони Тьюза - одно из таких решений, которое чрезвычайно легко реализовать и полностью прозрачно для конечного пользователя.

5
ответ дан 5 December 2019 в 14:03
поделиться

Обычно мы оставляем внешние интерфейсы Access на сетевых дисках и просто мирились с необходимостью сжатия и ремонта на регулярной основе. Вы, вероятно, обнаружите, что вам это нужно, даже если они установлены локально.

Если вам необходимо установить его локально, существуют различные инструменты, которые позволят вам «выталкивать» обновления программного обеспечения, и ребята из ServerFault могут получить дополнительную информацию о них. Предполагая, что такие инструменты недоступны, единственный другой вариант, который я могу придумать, - это написать небольшую программу-загрузчик, которая проверяет локальный .MDB на главную копию на сервере и повторно копирует ее, если они разные, до этого запуск МБР.

0
ответ дан 5 December 2019 в 14:03
поделиться

Возможно, потребуется просмотреть функцию api AccessibleObjectStartWindow Window , определенную в файле Oleacc.dll. Эндрю Уайтчепел имеет несколько статей о том, как его использовать. На основании его статей я написал ответ на очень похожий вопрос (о Excel, а не Word), который вы можете найти здесь:

Как использовать позднюю привязку для получения экземпляра Excel?

Там вы найдете пример, как подключиться к уже запущенному экземпляру Excel и затем автоматизировать этот экземпляр, используя позднюю привязку.

Обновление:

Вот краткий образец, адаптированный к Word:

using System;
using System.Reflection;
using System.Runtime.InteropServices;
using System.Text;

namespace WordLateBindingSample
{
    [ComImport, InterfaceType(ComInterfaceType.InterfaceIsIUnknown), Guid("00020400-0000-0000-C000-000000000046")]
    public interface IDispatch
    {
    }

    class Program
    {
        [DllImport("user32.dll", SetLastError = true)]
        static extern IntPtr FindWindow(string lpClassName, string lpWindowName);

        [DllImport("Oleacc.dll")]
        static extern int AccessibleObjectFromWindow(int hwnd, uint dwObjectID, byte[] riid, out IDispatch ptr);

        public delegate bool EnumChildCallback(int hwnd, ref int lParam);

        [DllImport("User32.dll")]
        public static extern bool EnumChildWindows(int hWndParent, EnumChildCallback lpEnumFunc, ref int lParam);

        [DllImport("User32.dll")]
        public static extern int GetClassName(int hWnd, StringBuilder lpClassName, int nMaxCount);

        public static bool EnumChildProc(int hwndChild, ref int lParam)
        {
            StringBuilder buf = new StringBuilder(128);
            GetClassName(hwndChild, buf, 128);
            if (buf.ToString() == "_WwG")
            {
                lParam = hwndChild;
                return false;
            }
            return true;
        }

        static void Main(string[] args)
        {
            // Use the window class name ("OpusApp") to retrieve a handle to Word's main window.
            // Alternatively you can get the window handle via the process id:
            // int hwnd = (int)Process.GetProcessById(wordPid).MainWindowHandle;
            //
            int hwnd = (int)FindWindow("OpusApp", null);

            if (hwnd != 0)
            {
                int hwndChild = 0;

                // Search the accessible child window (it has class name "_WwG") 
                // as described in http://msdn.microsoft.com/en-us/library/dd317978%28VS.85%29.aspx
                //
                EnumChildCallback cb = new EnumChildCallback(EnumChildProc);
                EnumChildWindows(hwnd, cb, ref hwndChild);

                if (hwndChild != 0)
                {
                    // We call AccessibleObjectFromWindow, passing the constant OBJID_NATIVEOM (defined in winuser.h) 
                    // and IID_IDispatch - we want an IDispatch pointer into the native object model.
                    //
                    const uint OBJID_NATIVEOM = 0xFFFFFFF0;
                    Guid IID_IDispatch = new Guid("{00020400-0000-0000-C000-000000000046}");
                    IDispatch ptr;

                    int hr = AccessibleObjectFromWindow(hwndChild, OBJID_NATIVEOM, IID_IDispatch.ToByteArray(), out ptr);

                    if (hr >= 0)
                    {
                        object wordApp = ptr.GetType().InvokeMember("Application", BindingFlags.GetProperty, null, ptr, null);

                        object version = wordApp.GetType().InvokeMember("Version", BindingFlags.GetField | BindingFlags.InvokeMethod | BindingFlags.GetProperty, null, wordApp, null);
                        Console.WriteLine(string.Format("Word version is: {0}", version));
                    }
                }
            }
        }
    }
}
-121--4605370-

У нас также есть тонна таблиц в нашей системе. То, что мы сделали, это нормализовали базу данных до хорошей точки, затем создали несколько представлений, которые охватывают наиболее распространенные потребности использования таблиц в нашей системе. Что-то подобное может помочь и тебе.

-121--2643506-

Мы разработали vbscript 'launcher' для наших приложений доступа. Это то, что связано с в меню «Пуск» пользовательских компьютеров и он делает следующее.

  • Он проверяет файл version.txt, расположенный в сетевой общей папке, чтобы проверить, содержит ли он текст, отличный от локально сохраненной копии
  • Если текст отличается, он копирует mdb доступа и новый version.txt на жесткий диск пользователя.
  • Наконец, запускается mdb в access

Для распространения обновления на ПК пользователя необходимо изменить текст в файле version.txt на сетевом общем ресурсе.

Возможно, можно реализовать нечто подобное

4
ответ дан 5 December 2019 в 14:03
поделиться
Другие вопросы по тегам:

Похожие вопросы: