Showing posts with label oledb. Show all posts
Showing posts with label oledb. Show all posts

Saturday, February 15, 2020

Office 365 and Access Engine

If you are developing an application using an Office 365 Access database, you may come across this error.

System.InvalidOperationException HResult=0x80131509 Message=The 'Microsoft.ACE.OLEDB.12.0' provider is not registered on the local machine. Source=System.Data StackTrace: at System.Data.OleDb.OleDbServicesWrapper.GetDataSource(OleDbConnectionString constr, DataSourceWrapper& datasrcWrapper) at 

If you are like myself, the instant reaction is to look for an Office 365 runtime. Indeed there is one available, however, this does not only not solving your problem, but it also overtake your proper "full" Access when you are trying open an accdb file.


So, what should I use then?  The answer is an Access Engine.  You may ask WTF, an Access Engine?  I am afraid I don't have an answer for this.  I can only say the Access Engine works but the runtime doesn't.  You can find the engine at:

https://www.microsoft.com/en-us/download/details.aspx?id=54920

After the installation, your application should be able to connect to OLEDB database as usual.

Here is an example I wrote:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Data.OleDb;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            string connectionString =
                @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=SampleDatabase.accdb;Persist Security Info=False;";

            Console.WriteLine($"Connecction String: {connectionString}");

            using (OleDbConnection conn = new OleDbConnection(connectionString))
            {
                conn.Open();

                OleDbCommand cmd = conn.CreateCommand();
                cmd.CommandText = "SELECT TOP 1 message FROM Sample";

                string message = (string)cmd.ExecuteScalar();

                Console.WriteLine($"Message from database: {message}");
            }
        }
    }
}






If you still encounter the "Microsoft.ACE.OLEDB.12.0" error after installing the engine, you may want to change the platform target from ANY to x86 for 32bit or x64 for 64bit engine.




Updated 2020-02-26

If you have stability issues, e.g. SSIS project keeps crashing when using OLEDB to connect to a data source, you may want to downgrade the engine to 2010 (https://www.microsoft.com/en-gb/download/details.aspx?id=13255)

Tuesday, September 13, 2011

Access ... thanks Microsoft for another problem!

Today I have this funny problem which Access and OleDB gave me two different results for the same view.  After hours of puzzling, finally found out it is because of the wild card used in the LIKE clause.

The story as follow, I have a view in Access similar to the below

select * where code like '*fun*'

This works fine within Access, i.e. only result contains "fun" returned.  However, when I accessing this view within VisualStudio via OleDB, the conditional clause was ignored.  Since I am accessing the same view within the same Access database, it really puzzled me why the different results returned, especialy there was no errors returned.

Initially I thought it was because of caching, so I restarted my machine.  Run the query within Visual Studio after restart, same problem.

Then I removed the connection within Visual Studio and recreate it as I thought it may caused by wrong settings.  Again, same problem.

Finally, I  replaced the * with % as I would write my LIKE in standard SQL. Bingo, everything works as intended.

Thanks Microsoft.  Can you not try to be special and screw things up?!