Querying Jet Databases/Excel files with C# under x64 OS - odbc

So I have learned that that the Microsoft.Jet.OLEDB.4.0 data provider for querying data sources like Microsoft Access MDB files and Excel spreadsheets does not work under a Windows 64-bit operating systems.
What I am now supposed to use to query against these file types in .NET 3.5 (C#) applications in order to ensure compatibility in both x86 and x64 environments? I have scoured the Internet and I cannot seem to find a straight answer on how to handle this incompatibility.
I've also tried using an ODBC provider and a MSDASQL provider with no luck as they seem to throw the same exceptions as the Microsoft.JET.OLEDB.4.0 provider does when used in a x64 environment (unless I am doing something flagrantly wrong with these other two providers even though they work fine under in my Windows XP x86 environment).
I’ve found people saying that I need to use %WINDIR%\System32\odbcad32.exe for ODBC connectivity in x64 systems, but I have on idea how to utilize this.
Example Exeption Thrown Under x64:
************** Exception Text **************
System.InvalidOperationException: The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine.
at System.Data.OleDb.OleDbServicesWrapper.GetDataSource(OleDbConnectionString constr, DataSourceWrapper& datasrcWrapper)
at System.Data.OleDb.OleDbConnectionInternal..ctor(OleDbConnectionString constr, OleDbConnection connection)
at System.Data.OleDb.OleDbConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)

what's happening here is that a x64 assembly is trying to call a x86 COM component. The x64 app won't see the COM registrations in the primary x64 registry,since theyre in the wow6432node hive.
Easiest workaround is to build the application with a x86 target platform and let it run on the WOW later on your x64 machine. The app will run as 32-bit and be able to see the 32-bit COM objects it needs.

Everything that I've seen in my own recent research confirms what you are seeing - that there simply isn't a 64-bit Jet driver. Also, I found a post on THIS thread that seems to confirm that the 64-bit MSDASQL won't help as it is really just a wrapper (see the last post, dated May 8 from Ricky Wen). Your only option is to link thru a 32-bit proxy, perhaps another 32-bit SQL server. I may end up doing this myself, until I can move the Jet data to SQL.

There is now a 64 bit ODBC driver for JetSQL. It is the Microsoft Access Database Engine 2010 Redistributable. I have not used it for OLEDB, but I have used it to make new Microsoft Access databases with PowerShell.

Related

OraOLEDB.Oracle provider is not registered on the local machine (VS 2013)

I had install a Visual studio 2013 ultimate version and oracle 11g express edition (11.2.0.2.0 64 bit) in my pc.
I tried to open a existing project and try to connect the database, but it throw me the error above. as long as I refresh the database OR conn.open(), it will throw me "OraOLEDB.Oracle provider is not registered on the local machine".
Anyone has experience this issues? or any method that might help on this? I have struggle with this problem for few days.
Your comment and suggestion is much appreciated!!!
Looks like you did not install the "OraOLEDB.Oracle" - it is not included by default.
Check your options in Oracle Universal Installer or you can download it from here 64-bit Oracle Data Access Components (ODAC) Downloads
Note, since you installed 64 bit version of Oracle, you also have to compile your application as "x64", otherwise it does not work.

Which Oracle drivers do I need for ASP.NET 4.5?

I am trying to install the correct Oracle drivers on my development machine. I'm creating an ASP.NET web site and every time I run I get an error saying that says "The provider is not compatible with the version of Oracle client". I have tried both 32-bit and 64-bit Oracle drivers but have still had no luck. Can someone lead me to a link for the drivers I need based on my specs?
I'm using Windows 8 64-bit. The database is Oracle 11.2.0.2.0 - 64 bit.
The ODAC112021Xcopy_x64.zip might give you the dll's and client you'll need. Take a look at this previous answer for more detail about deployment of the application.

Win 7 and ODBC with 64 bit

I am developing an ASP.NET Application and am trying to use the 64-bit driver version of ODBC on my 64 bit win 7 machine, because the deployment server has Windows Server 2008, which is naturally in 64 bit, since Microsoft decided not to make a 32 bit version afaik.
The first issue was an System.Data.Odbc.OdbcException "ERROR [IM014] [Microsoft][ODBC Driver Manager] The specified DSN contains an architecture mismatch between the Driver and Application". Despite the fact, that I am developing on a 64 bit operation system, the compiler seems to have decided to compile for 32 bit. After some research I changed the target platform to x64 in every of my (own) assemblies. I am using NHibernate and Spring.Net, but I read somewhere that 64 bit is no problem for NHibernate. I did not check Spring.Net yet. The compilation began.
I got some warnings that quite every .net assembly is built for another platform, but I read somewhere again that I can ignore these warning and the application should run just fine because the runtime (or compiler?) will figure out the right assembly.
So I tested the application right away and was rewarded with an System.BadImageFormatException (wrong format). It was again an exception concerning 32/64 bit issues although every one of my assemblies is compiled as 64 bit.
I am slowly starting to hate 64 bit. Seriously. Is it that difficult to build an 64 bit application on an 64 bit operation system for a 64 bit server with 64 bit drivers?
Does anybody have a solution or have experience with this issue? I found many workarounds with using 32 bit, but that is not an option here. It has to be a 64 bit solution.
Nevertheless I will continue trying for myself to solve this. I will write any progress here.
Update:
Spring.Net seems to be just fine on 64 bit since the assembly is "dynamically compiled at runtime to the native machine architecture".
i fought with this same error for several hours. My environment was slightly different, but the error was the same. I was using SSRS, Report Builder 3 and SQL Server 2008 R2 on a Win Server 2008 R2 x64 Box
I could create connections and test them successfully in SSRS, but when i would use them, i got the error above. It was resolved when i created a 32bit DSN of the same name and parameters.
I usually try to go other way: If I don't need any native in-proc DLLs, I use AnyCPU. So final program can be used on both x86 and x64. If I need native in-proc DLLs, I always chose x86 32bit version, because it is much easier to make it work correctly, and IMPORTANTLY I don't need any 64bit features. So why 64bit version? I just go to IIS configuration and setup my asp.net application to run in 32bit mode.
For example my current deveopment environment is fully 64bit and works perfectly. But my production server is setup to host my app in 32bit mode. It works perfectly, no 64bit issues. I apologize if this answer is not good for you, but I really never needed 64bit stuff in my asp.net applications.
update: I use 32bit IIS on production server. I am not sure if it is possible to setup asp.net as 32bit in 64bit IIS.

32-bit Text drivers (Microsoft Access , Microsoft Excel and Text files ) from a 64 bit application on windows 7

Hi i have an application developed on XP with Text ODBC drivers. But when i deployed on Win 7 with office 2007, i have connection issues.
<add key="SQLConnection.TextConnectionString" value="Driver={Microsoft Text Driver (*.txt; *.csv)};Dbq=c:\Data\;Extensions=asc,csv,tab,txt;Persist Security Info=False" />
ERROR [IM002] [Microsoft][ODBC Driver Manager] Data source name not found and no default driver specified
i have googled every solutions like installing the following
http://blogs.msdn.com/b/sqlblog/archive/2009/12/29/how-to-connect-to-file-based-data-sources-microsoft-access-microsoft-excel-and-text-files-from-a-64-bit-application.aspx
Microsoft Access Database Engine 2010 Redistributable (32-bit)
2007 Office System Driver: Data Connectivity Components
after all of those, in my datasources(ODBC), it still only shows "SQL native client/SQL server/SQL server native client"
in the C:\Windows\SysWOW64\odbcad32.exe
i can see all the x32 drivers, but how can i modify my connection strings to access 32-bit Microsoft Text Drivers or are there any alternative solutions?
Thanks
I'm pretty sure it'll work automatically (even on a 64-bit machine) as long as the executing process is 32-bit.
Try recompiling to target x86 specifically.
You need the 64-bit Microsoft Access Database Engine 2010 Redistributable
http://www.microsoft.com/downloads/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en
Then try
Microsoft Access Text Driver (*.txt, *.csv)
for the driver name.
AFAIK, all 64-bit ODBC drivers from the Microsoft Access Database Engine 2010 64-bit Redistributable have slightly changed their driver names, I guess to differentiate them from their 32-bit counterparts.
I had this exact problem and the recompiling to target x86 specifically worked! Note that in order to do this I had to specify the Target CPU in the advanced compiler setting dialog - Project Menu> Properties> Compile tab> Advanced Compile Options button.
Before finding this forum entry I did install the Microsoft Access Database Engine 2010 Redistributable (32-bit) but I don't know if that had any affect on this issue.
As mentioned above, when the executing process is 32-bit (in this case compiling against x86 makes the app 32-bit specific) the application will use the drivers from C:\Windows\SysWOW64\odbcad32.exe.
Thanks Cameron.
We were doing this from ASP.Net and got it working on Windows 2012 just by moving the one site into a separate app pool that had "32-bit Enabled" turned on in the advanced settings for the App Pool.
A lot of people seem desperate here, I want to offer a few solutions. But, first I want to highlight what a dated proprietary trash idea from the 90s this is.
Use Unix ODBC to host the text file from Linux which the docs (seem to) claim to support an implementation of the Microsoft text driver
A better option would be of course to import the CSV into PostgreSQL.
I would suggest just doing this with \COPY and dropping the notion of a CSV.
You can maintain the CSV with PostgreSQL acting as a server with the Foreign Data Wrapper (file_fdw).
If you don't want to run an RDBMS, the modern way would be to use SQLite. This is a great idea if you don't need the server/client model.
The ODBC->text interface is especially insane, because ODBC doesn't define configuration beyond connection (so I assume there are lots of assumptions there).

"The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine"...DNN

I'm trying to get a new DotNetNuke site up and running on our 64-bit server, and I'm encountering the following error message:
"The 'Microsoft.Jet.OLEDB.4.0' provider is not registered on the local machine"
I know from experience that you run into this when you target a 64-bit assembly on a 64-bit machine (there is no 64 bit OLE-DB provider currently). In that case, I simply target the x86 in Visual Studio and everything works fine.
But in this case, the site uses dynamic compilation, so there's no simple place to specify that I need to target x86. Any thoughts?
TIA.
You could change your app pool that you're running that site under to run as a 32 bit application. In the IIS7 manager, its under "Advanced Settings" of your app pool, and then set "Enable 32-bit Applications" to true.
You could also do this with AppCmd from a console with the following:
appcmd apppool set /apppool.name:MyNukeSite /enable32BitAppOnWin64:true
In IIS6 - you could try something like this (2 lines here, run aspnet_regiis when finished changing the metabase value)...
cscript %SystemDrive%\inetpub\AdminScripts\adsutil.vbs set w3svc/AppPools/Enable32bitAppOnWin64 1
aspnet_regiis.exe -i
See the following for more info:
http://www.microsoft.com/technet/prodtechnol/WindowsServer2003/Library/IIS/5d306956-b2a2-4708-9bb9-72a395d474bb.mspx?mfr=true
http://blogs.msdn.com/irfanahm/archive/2008/12/15/how-to-use-a-32-bit-dll-in-asp-net-page-which-is-hosted-on-64-bit-iis.aspx
http://support.microsoft.com/kb/895976
HI, Now the Microsoft has released the 2010 Office System Driver Beta: Data Connectivity Components which is supported both in 32 bit as well as 64 bit OS. So using this driver instead of the traditional Microsoft.Jet.OLEDB.4.0 driver will give us a 64 bit application running on a 64 bit server (that is what we really need).
Though this is in beta, it worked fine for me.
You can download this driver from 2010 Office System Driver Beta: Data Connectivity Components
Thnks
You shouldn't try to target your application to 32-bit in which case you are losing the advantages of using 64-bit system. As aaa has pointed out, you can use the latest Access Database Engine 2010 to address this issue. Please refer to my blog post for complete solution.
Hope it helps.

Resources