База данных Compact Access 2007 на 64-битных Windows 2008 Server - PullRequest
1 голос
/ 15 сентября 2011

Я столкнулся с проблемой при использовании JRO в приложении winform для компактного доступа к базе данных на сервере Windows Server 2008 R2 (64-битный).Я выполнил следующие шаги:

Конфигурация ПК разработчика:
ОС: Windows XP Professional Ver: 2002 (SP3) 32-бит
MSOffice 2003 Установлено: Да
Visual Studio: 2010 Premium
.Net framework: 4.0.30319

Создано два приложения winform с кодом ниже:

Приложение 1: Для сжатия Access 2007 DB

Целевая платформа установлена ​​наx86 и добавленная ссылка на библиотеку Microsoft Jet и объекты репликации 2.6

Файл конфигурации:

<?xml version="1.0"?>
<configuration>
<startup><supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0,Profile=Client"/></startup>
<appSettings>
<add key="SourceDB" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Test\Test2007.accdb;Jet OLEDB:Engine Type=5"/>
<add key="DestDB" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Test\Test2007BK.accdb;Jet OLEDB:Engine Type=5"/>
<add key="AppDB" value="Provider=Microsoft.ACE.OLEDB.12.0;Data Source=D:\Test\Test2007.accdb;" />
</appSettings> 
</configuration>

Код:

        string SrcDBName = ConfigurationManager.AppSettings["SourceDB"];
        string DestDBName = ConfigurationManager.AppSettings["DestDB"];

        int ReturnCode = 0;
        JRO.JetEngine objJRO = null;
        try
        {
            MessageBox.Show("Start Compact");
            objJRO = new JRO.JetEngine();
            objJRO.CompactDatabase(SrcDBName, DestDBName);
            MessageBox.Show("End Compact");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error in Compact");
            ReturnCode = -1;
            StackTrace STrace = new StackTrace(ex, true);
            StackFrame StkFrame = STrace.GetFrame(STrace.FrameCount - 1);
            string Disp_Msg = "Message:\t" + ex.Message + Environment.NewLine;
            Disp_Msg += "Error Date:\t" + DateTime.Now.ToString("dddd, MMM d yyyy HH:mm:ss");

            //MessageBox.Show(Disp_Msg, "Compact Utility", MessageBoxButtons.OK, MessageBoxIcon.Error);
            File.AppendAllText(Path.GetDirectoryName(Application.ExecutablePath) + @"\CompactErr.txt", Disp_Msg + Environment.NewLine + "Stack Trace:\t" + ex.StackTrace + Environment.NewLine + Environment.NewLine);
        }
        finally
        {
            Marshal.ReleaseComObject(objJRO);
            objJRO = null;
        }

Приложение 2: для тестирования соединения с Access 2007

private void Form1_Load(object sender, EventArgs e)
    {
        try
        {
            //Connection Test
            MessageBox.Show("Start DBConn");
            TestConn();
            MessageBox.Show("End DBConn");
        }
        catch (Exception ex)
        {
            MessageBox.Show("Error in Conn Opening");
            string Disp_Msg = "Message:\t" + ex.Message + Environment.NewLine;
            Disp_Msg += "Error Date:\t" + DateTime.Now.ToString("dddd, MMM d yyyy HH:mm:ss");
            File.AppendAllText(Path.GetDirectoryName(Application.ExecutablePath) + @"\CompactErr.txt", Disp_Msg + Environment.NewLine + "Stack Trace:\t" + ex.StackTrace + Environment.NewLine + Environment.NewLine);
        }
    }

    public void TestConn()
    {
        string strConnectionString = ConfigurationManager.AppSettings["AppDB"];
        DbConnection objConnection;
        DbProviderFactory objFactory = OleDbFactory.Instance;

        objConnection = objFactory.CreateConnection();
        objConnection.ConnectionString = strConnectionString;
        objConnection.Open();
        objConnection.Close();
    }

Теперь более 2 exe развернуты на Win2008 Server:

Сведения о сервере:

Windows Server 2008 R2 (SP1) - 64 бита
НЕТ MSOffice
NO Visual Studio
Установлено: Microsoft Office Access Database Engine 2010

Случай 1: когда установлен Access DB Engine 2010 (64-битный):
Ссылка: http://www.microsoft.com/download/en/details.aspx?id=13255

  1. Соединение с Access 2007 (Test2007.accdb) is ПРАВИЛЬНО ВЫПОЛНЕНО
  2. Сжатие БД с использованием JRO НЕ РАБОТАЕТ
  3. Сообщение об ошибке при выполнении шага 2:

Сообщение: классне зарегистрирован
Трассировка стека: в JRO.IJetEngine.CompactDatabase (String SourceConnection, String Destconnection) в CompactUtility.Program.Main (String [] args)

Случай 2: когда установлен Access DB Engine 2007:
Ссылка: http://www.microsoft.com/download/en/details.aspx?displaylang=en&id=23734

  1. Соединение с Access 2007 (Test2007.accdb) НЕ СДЕЛАНО
  2. Сжатие БД с использованием JRO ПРАВИЛЬНОWORKED
  3. Сообщение об ошибке при выполнении шага 1:
    Сообщение: поставщик «Microsoft.ACE.OLEDB.12.0» не зарегистрирован на локальном компьютере.

Любое предложение / помощь будут высоко оценены как для работы на сервере Windows Server 2008 (64bit).

Также приведены ссылки ниже, но не полезно:

Microsoft.ACE.OLEDB.12.0 провайдер не зарегистрирован

Спасибо, Шах

1 Ответ

0 голосов
/ 20 января 2014

Я знаю, это старый вопрос, но все же, Эта ссылка помогла мне со вторым вопросом. Если я правильно помню, проблема связана с 64-битной проблемой с двигателем. Добавление компонента в Visual Studio должно исправить это поведение.

...