How to determine which version of "Oracle.DataAccess.dll" to include - winforms

While deploying my .NET 3.5 Windows form to different environments we ran with lots of invalid provider issues.
It works on some and doesn't work on others.
Could someone please help me out, how do I determine which version of "Oralce.DataAccess.dll" to use i.e. 9 or 10 or 11 or 9.1.* or 10.1.* or 11.* or 12 etc.
Does it depend on server where I'm installing an application? OR
Does it depend on back end oracle database?

I second the notion of using the 100% managed provider. It eliminates the need to know details I'm about to discuss. The only issue here is I think you might need to upgrade to .net 4.0.
TLDR Version:
Use the 12c 100% managed provider instead.
The short answer is don't mix the provider (Oracle.DataAccess.dll) with a different version of the unmanaged client (at least not backwards).
Consider redesigning to include a service layer that eliminates the need to have the Oracle provider on the client in the first place.
Full version:
First, lets make sure we understand the components of the old unmnaged provider (not the new 12c 100% managed provider). It's made up of two pieces:
the managed .net component - Oracle.DataAccess.dll
the unmanaged (non-.net) client
Simply speaking, Oracle.DataAccess.dll is nearly just a wrapper, translating .net instructions into ORACLE-NET instructions for the unmanaged client.
That said, when you load Oracle.DataAccess there is a order in which it tries to locate the unmanaged client dlls that it needs. From the Oracle Documentation:
The Oracle.DataAccess.dll searches for dependent unmanaged DLLs (such
as Oracle Client) based on the following order:
1.Directory of the application or executable.
2.DllPath setting specified by application config or web.config.
3.DllPath setting specified by machine.config.
4.DllPath setting specified by the Windows Registry.
HKEY_LOCAL_MACHINE\Software\Oracle\ODP.NET\version\DllPath
5.Directories specified by the Windows PATH environment variable.
This comes into play if you have more than one client installed on the machine so this could be part of your issue. If so, the simple thing to do is use the dllPath configuration variable in your config:
<configuration>
<oracle.dataaccess.client>
<add key="DllPath" value="c:\oracle\product\1.1.0-xcopy-dep\BIN"/>
</oracle.dataaccess.client>
</configuration>
Now, to answer your question directly - I don't believe Oracle supports mismatching Oracle.DataAccess.dll with it's client (at least not backwards). Your best bet is either to install ODP.net with your app install - the xcopy version is the smallest and contains the "instant client" Or, you should be thinking about minimum system requirements - ie. The system must have at least version X of odp.net installed. You could then compile against that minimum dll and rely on publisher policy redirection when a target system has a NEWER version of the client.
Of course this also prompts me to ask about architecture. Do you plan on prompting the user for their Oracle account? If not, you have to be careful on how you protect the shared service account your application will use. You may be better off making calls to a webservice that makes the oracle calls on the clients behalf - giving you another security layer and simplifying your client deployment.
Most version of ODP.net are backwards compatible with the database server - you can certainly use the 11g provider with a 10g database.

First of all clarification:
You have an Oracle Database Server (you called it "back end oracle database") and an Oracle Client (no matter if this is installed on an application server, from Oracle point of view, it is the client)
The version of ODP.NET (Oracle Data Provider for .NET, i.e. the Oracle.DataAccess.dll and some more files) are defined by the Oracle Client. You can use almost every ODP.NET version to connect to every Oracle database version - more or less.
The error message "The provider is not compatible with the version of Oracle client" could also mean there is no ODP.NET provider installed at all. In this case the error message is indeed a bit misleading. So, first check if ODP.NET is installed at all, it is not included in standard Oracle Instant Client installation.
When I check all available downloads from Oracle you have ODP.NET version
9.something
10.something
1.x
2.0
4.0
9.? and 10.? refers to version of Oracle, 1.x, 2.0 and 4.0 refers to version of Microsoft .NET Framwork (strange numbering, but that's how it is). Version 9.? and 10.? are very old, I don't think it makes any sense to use them. 1.x was supported until Oracle client version 11.1.
If your Oracle client is 11.2 or higher you are forced to include ODP.NET version 2.0 or 4.0.
If your Oracle client is between 10.2 and 11.1 you can use eiter ODP.NET version 1.x or 2.0
If your Oracle client is older than 10.2, I don't know how it works - it's outdated anyway.
Version 1.x and 2.0 are not compatible to each other, i.e. perhpaps you have to provide two different setup files of your application to your customer and the customer has to select the correct one depending on his local oracle client installation.
I don't know the situation for 2.0 vs. 4.0, I never used 4.0 so far.
It is not required to put a local copy of Oralce.DataAccess.dll into your application directory. It will be taken from GAC (Global Assembly Cache) where it is installed.
In your developing you only have to take care only these mayor version, for example 2.0.
Then your loal GAC knows due to policy files which exact version is loaded, e.g. 2.0.10.2.0.2.20 or 2.0.11.1.0.6.20 or 2.0.11.1.0.7.20 or 2.0.11.2.0.1.2 or whatever.
On top of this all you have to know whether your Oracle client is 32bit or 64bit and include ODP.NET accordingly.
Here you can get more information: Oracle Data Provider for .NET FAQ

if you have client or oracle instance installed in your system. check the folder name
ORACLE_HOME\product\11.2.0\dbhome_1\ODP.NET\bin\2.x
here you will find the file - Oracle.DataAccess.dll
just include in your reference.

In fact I believe there is no right answer.
It all depends on the processor architecture (so bits) the application runs with, the version of OCI client you use, etcetera.
I found it most useful to wrap the Oracle interaction in one class, using Reflection to find the available version to use.
Regarding the version number: the version of the ODP.net assemblies must match those of the OCI client installation. It is a bad idea to mix the 12.* OCI client with the 10.* ODP.net assemblies.
Maybe this article is also useful to you.

If your Oracle server is version 10.2 or higher, you could consider simply using the managed ODP.NET version which came available with Oracle 12.
Apparently it's one dependency, under 10 MB. It should make deploying your application to different systems a lot easier compared to the ODP.NET versions that depends on Oracle (instant) Client. It should also avoid you having to care about any installed Oracle Client.
However, they do mention it works on "the latest version of the .NET Framework 4.5.1", so from what I understand you need to upgrade your application to 4.5.1, but maybe that is only if you want to use the certain features (like the Entity Framework support).
http://www.oracle.com/technetwork/topics/dotnet/index-085163.html

Sometimes you get the Could not load file or assembly 'Oracle.DataAccess' or one of its dependencies. whereas you have the right dll and the problem is somewhere else.
It happen to me (and this topic helped me a lot to figure it out) and it was the configuration of my application pool in IIS who wouldn't allow 32 bit applications (advanced settings).

Related

Oracle Database Express Edition for Mac

I start my second semester of university on the 6th of July and one of my subjects is Database Concepts.
For the subject, we must install two programs "Oracle SQL Developer" and 'Oracle Database Express Edition". There is a Mac version Oracle SQL Developer but only Windows or Linux for Oracle Database Express Edition. I tried to install the latter with Docker but keep running into issues. Mainly when I start it there are no logs and I always get this error:
"The Oracle Database is not configured. You must run '/etc/init.d/oracle-xe-18c configure' as the root user to configure the database.
The following output is now a tail of the alert.log:
tail: cannot open '/opt/oracle/diag/rdbms///trace/alert*.log' for reading: No such file or directory
tail: no files remaining"
I have followed this tutorial and done exactly what he does but at timestamp 11:47 you can see that he has log messages while I just have the error posted above.
https://www.youtube.com/watch?v=CbopSCwATIg
Hoping someone can help me with this, if I can't fix this then I will have to use my Windows partition which isn't very convenient. If there. is no solution to this can someone please recommend an alternative of Oracle Database Express Edition for Mac that is free?
Many thanks.
To run the Oracle Database in MacOS, you have different choices. The most easy ones are:
Oracle Cloud Free Tier
You can setup your free online Oracle Cloud Free Tier environment and configure your local SQL Developer installation to the Cloud environment. https://www.oracle.com/cloud/free/
For further information about the Cloud Free Tier environment, check the posts https://dgielis.blogspot.com/2019/09/best-and-cheapest-oracle-apex-hosting.html from Dimitri Gielis for detailed instructions on how to do that.
Note that this is the only option if you own an ARM64 (M1/M2) based Mac.
Vagrant/VM
For a local setup, this is the most easy way in my opinion, since I'm not an experienced user of Docker. Oracle has made Virtual Machines available for free, https://github.com/oracle/vagrant-projects
Use the OracleDatabase v18.4.0-XE or v19.3.0 image, if you need the database only.
Use the OracleAPEX (v18.4.0-XE) image, if you intend to use APEX as well.
Docker
If you are known to Docker or want to learn it, you can follow the link in #Bjarte Brandt comment https://github.com/bjarteb/oracle-apex-ords. The setup documentation in that link is quite comprehensive.
Update due to Apple's M1/M2 processor
Since Apple introduced new M1/M2 mac's based on the ARM cpu architecture, the only option left available for the moment is the Oracle Cloud Free Tier. Unfortunately, VirtualBox VM doesn’t support the ARM architecture yet and it doesn’t work with Rosetta..
(13/09/2022) Oracle SQL Developer 22.2.1 is now natively available for MacBook M1/M2 clients. Previous versions would need Rosetta to run. Unfortunately, no signs for VirtualBox supporting ARM yet..
If you own a MAC based on the 'old' Intel processor, you would still have the other two options as well.
I will update this answer when more options for M1/M2 mac's become available.

Different between Gnome ODBC vs Microsoft ODBC

What is the difference between Gnome ODBC(Gnome-DB) and Microsoft ODBC?
https://developer.gnome.org/libgda/stable/introduction.html has some information on why Gnome Data Access (GDA, otherwise referred to as Gnome-DB) was developed, to try to tackle perceived limitations with ODBC (and JDBC). https://wiki.debian.org/GNOME-DB indicates the Gnome-DB project aims:
to provide a free unified data access architecture to the DebianGnome project
It tries to fulfill the same role as ODBC, to provide a standard API allowing clients to work with multiple databases with minimal changes.
It perceives ODBC as being:
mostly limited to the Microsoft Windows environment (even though the
UnixODBC project exists and links to some drivers), and the API is
quite old and not well integrated into the GNOME ecosystem.
The latest news item from http://www.gnome-db.org/News is currently dated 2015-06-12 for a 5.2.3 maintenance release.
http://www.gnome-db.org/SystemRequirements indicates the software runs on any recent Linux version (as of 2015-01-04) and on Windows, plus other Unix systems.
I can't find information relating to usage levels, but certainly ODBC (whether on Windows or using UnixODBC or iODBC on Linux/elsewhere) seems more popular in my experience, as does JDBC.

Delphi connection to SQL Server - 'futureproof' replacement for BDE?

we have an applcation of some size (about 1MLOC) that were started back in the days when BDE was just about to be deprecated. Nowadays we only use it to connect to SQL Server using ODBC. It has worked surprisingly well in spite of its deprecated status, and chances are it will keep on working for another 15 years. However, no one knows if or when it stops working. And if it stops, Embarcadero wouldn't be able to do much about it. So, it's a timebomb, and we need to replace it. But with what?
The ADO-components in Delphi looks promising. There are table and query components that resembles the BDE-components, and they are not third-party components made by a one-man shop that might loose interest. We also look forward to use connection-strings instead of the clunky ODBC-Administrator.
However, about a year ago Microsoft announced that OLE DB is deprecated, and for native development we should use SQL Server Native Client ODBC driver.
So, my qestion is, is the ADO-components in Delphi hardwired to OLD DB? Or would we not be using OLE DB if we select "SQL Server Native Client" in the list of drivers?
I expect/fear that to make use of the SQL Server Native Client ODBC driver, we have to set up a datasource in ODBC-Adminstrator, like we do now. Or is it possible to connect with ODBC using connection-strings?
And what Delphi-components exists that can connect to ODBC without using OLE DB?
Yes, I know about dbExpress, but it looks like it would take us years to convert to it from BDE.
Thanks,
LandShark
We had a similar migration need 5 years ago and did quite a bit of research and testing on it. The easiest migration path from the BDE is to SDAC from devart (http://www.devart.com/sdac/). Devart has a BDE replacement utility that goes through your code and replaces the BDE components with equivalent SDAC components. It will get you about 90% of the way there then you have to manually make some changes to get everything to work (e.g., if you use fetchall, have to comment out all the fetchall code - but you will see a pattern and can fix the remaining code mostly through search and replace). Performance of the SDAC components is excellent, they support all the sql server calls and you can use encrypted connections over the internet. The components support Native SQL or OLEDB connections to SQL Server. They also work in detached mode using cached updates. Another option, if you plan on supporting other database platforms in addition to SQL server is to use UniDac - it's just like SDAC but will work with SQL Server, Oracle and others - very similar to the old BDE without the overhead.
1) "native connection" does not mean use of ODBC or OLE DB, nor BDE and DBX. Native connection mean using special library that only can connect to MS SQL and that does not uses any standard server-agnostic pipileines. Contrary BDE and DBX and ADO and ODBC are generic libraries providing connection to any server you'd install plugin for.
Generally native libraries provide you closer integration with server and use of some features that generic libraries may miss (like events in firebird/interbase servers). They can also work faster for they do not need to transcode data streams and commands to/from the pipeline public API standards.
Public interfaces OTOH aid you with easier switch of servers and easier development of server-agnostic application.
2) Why do you think that BDE -> DBX conversion would be any harder than BDE -> ODBC or BDE -> ADO or BDE-> whatever ? The conversion is the conversion. ADO also has its share of limitations and gotcha's like DBX and like any other library.
3) DBX have MS SQL plugin. DevArt offers their suit of DBX plugins and may provide better one than stock Delphi DBX MS SQL support. Or maybe not.
4) Aside of those there are few well-known server-agnostic libraries
ZeosLib - FLOSS but have poor support for recent Delphi versions. Eternal alpha.
AnyDAC - http://www.da-soft.com/anydac , commercial, well-known
UniDAC - http://www.devart.com/unidac , commercial, well-known
5) you can have a lot of direct ODBC connection on any component collector site like http://www.torry.net/pages.php?id=570
6) same for native MS SQL connectivity http://www.torry.net/pages.php?id=1513
However, evaluating those choices and making your decision requires inside context knowledge that only you can have.
We had the same problem a few years ago. I suppose if there would be a perfect solution then there wouldn't be that many alternatives.
Anyway, we switched from BDE + ODBC to ADO + SQLOLEDB. The main reasons was that it was very reliable, easy to convert, didn't require anything extra to be installed on customer computers (such as BDE) and was faster than others shipped with delphi, including DBX (when using DisableControls).
Also as a side remark, if you want to use ODBC to configure the connection, you can use the ODBC manager to configure the values but read them from the registry and connect directly without ODBC. That helped us to do the switch.

Jet database 32 and 64 bits and alternatives

We have an application that makes use of OLEDB and the Jet engine Microsoft.Jet.OLEDB.4.0. We are converting our application to also run in 64-bit mode. However, the database engine is no longer a standard part of 64-bit Windows. But Office 2010 64-bit does install a 64-bit access database engine (See http://www.microsoft.com/downloads/en/details.aspx?familyid=C06B8369-60DD-4B64-A44B-84B371EDE16D&displaylang=en) so you can use Microsoft.ACE.OLEDB.12.0.
So I am working on fixing issues so that our application runs in 64-bit mode as well. But the OLEDB code complains about the database engine not being registered. So I try to install the redistributable 64-bit engine on the above link. But it tells me I need to uninstall 32-bit Office 2007 first. No way am I going to do that, because I am sure some settings etc. will be lost.
So my questions are:
How is that the 32-bit database access components do not work in 64-bit mode, but you cant install the 64-bit one if the 32-bit is installed already? Does that make any sense to anyone at all?!
I realize Microsoft wants people to switch to SQL server Express, except it is too invasive, does install reliably even on clean new Windows 7 computers, and it is not simple to copy or move the data around between different machines. Is there a suitable alternative to Jet then? Something that is simple but works on 32 and 64 bit and ideally has OLEDB and ODBC support? SQLite looks promising maybe?
Just did a quick search and there doesn't seem to be alot of alternatives to Access without going to SQL server. I found This, http://www.vistadb.net/, which sounds cool but the developers license is pretty expensive.
As an alternative, you can still use Access without installing the 64 bit driver. This happened to me, had to read from Access but could not convert the app to 32 bit. My answer was to write a separate 'proxy' executable that would run in 32 bit. I'd start the app using the System.Diagnostics.Process object and communicate with it through redirected standard input and output, passing the connection string as a command line parameter. The DataTable class has built in ReadXML and WriteXML functions which makes passing the data like this easy.

Delphi 2010 Professional and remote database access

When looking for which version of Delphi 2010 to buy, we found the following limitation on the professional one:
Delphi 2010 Professional is designed
for developers building
high-performance desktop GUI and
touch-screen applications with (or
without) embedded and local database
persistence.
What does this really mean? Does this mean that we'll only face this restriction if we choose to use the native vcl components for database access we'll face this restriction.
And what if we choose to use ADO components instead of those? In this case, how can Delphi avoid us to access remote database servers? Did anyone here ever tried this?
Going even further: if we choose to use a database like Firebird, which is just one file, and used a network mapped drive. Could we be facing the same limitation?
Supposing we opt for ADO, what will be the main consequences?
As I understand it, they're referring specifically about dbExpress and doesn't restrict you from using dbGo or some third party library to access remote databases.
Does this mean that we'll only face
this restriction if we choose to use
the native vcl components for database
access we'll face this restriction.
Yes. The professional version simply leaves out some of the driver & driver technology that natively supports certain databases. It still includes ADO support and there are plenty of third-party drivers that you can use to access other databases.
Delphi 2010 does not include any technology to stop you from building applications that interact with remote databases aside from the fact that it does not include DB Express (its own database driver technology).
DataSnap is not included in the Pro version either. I got quite interested at a recent Delphi workshop when they showed off DataSnap only to discover when I got back that it's missing from the Pro version.
So I'm back to sticking with my SDAC components and other third party middleware components. Works perfectly without the expense of the enterprise version.
The SQL Server dbExpress driver isn't included (amongst others) but the ADO/dbGo stuff seems to work just fine over the network. But we haven't used the Delphi supplied DB drivers since Delphi 3 due to them keep changing their mind about the latest silver bullet for DB access (much like MS do/did).

Resources