Qual è l'ingombro minimo del client richiesto per connettere C# a un database Oracle?
Domanda
Mi sono connesso con successo a un database Oracle (10g) da C# (Visual Studio 2008) scaricando e installando gli strumenti di amministrazione client e Visual Studio 2008 sul mio laptop.
L'ingombro dell'installazione per gli strumenti Oracle Client era di oltre 200 Mb e piuttosto lungo.
Qualcuno sa qual è l'ingombro minimo praticabile?Spero che sia una singola DLL e un comando di registrazione, ma ho la sensazione di dover installare una Oracle Home e impostare varie variabili di ambiente.
Sto utilizzando Oracle.DataAccess nel mio codice.
Soluzione
È necessario un client Oracle per connettersi a un database Oracle.Il modo più semplice è installare il file Componenti di accesso ai dati Oracle.
Per ridurre al minimo l'ingombro, suggerisco quanto segue:
- Utilizzare il provider Microsoft per Oracle (System.Data.OracleClient), fornito con il framework.
- Scarica il Pacchetto client istantaneo Oracle - Base Lite:questo è un file zip con (quasi) il minimo indispensabile.Raccomando la versione 10.2.0.4, che è molto più piccola della versione 11.1.0.6.0.
- Decomprimere i seguenti file in una cartella specifica:
- v10:
- oci.dll
- orannzsbb10.dll
- oraociicus10.dll
- v11:
- oci.dll
- orannzsbb11.dll
- oraociei11.dll
- v10:
- Su una piattaforma x86, aggiungi la DLL CRT per Visual Studio 2003 (msvcr71.dll) a questa cartella, poiché i ragazzi di Oracle si sono dimenticati di farlo leggi questo...
- Aggiungi questa cartella alla variabile di ambiente PATH.
- Usa il Denominazione facile da connettere metodo nella tua applicazione per eliminare il famigerato file di configurazione TNSNAMES.ORA.Sembra così:
sales-server:1521/sales.us.acme.com
.
Ciò equivale a circa 19Mb (v10).
Se non ti interessa condividere questa cartella tra più applicazioni, un'alternativa sarebbe quella di spedire le DLL sopra menzionate insieme ai file binari dell'applicazione e saltare il passaggio di impostazione del PATH.
Se hai assolutamente bisogno di utilizzare il provider Oracle (Oracle.DataAccess), avrai bisogno di:
- ODP .NET 11.1.0.6.20 (la prima versione che presumibilmente funziona con Instant Client).
- Instant Client 11.1.0.6.0, ovviamente.
Tieni presente che non ho testato quest'ultima configurazione ...
Altri suggerimenti
A partire dal 2014, OPD.NET, Managed Driver è l'impronta più piccola.
Ecco un confronto sull'utilizzo del codice con le versioni non gestite suggerite dalle risposte precedenti (obsolete):http://docs.oracle.com/cd/E51173_01/win.122/e17732/intro005.htm#ODPNT148
Dovrai scaricare queste DLL e fare riferimento Oracle.ManagedDataAccess.dll
nel tuo progetto:Scarica il ODP.NET, solo versione Managed Driver Xcopy
Ecco un'impronta tipica che dovrai allegare alla tua release:
Oracle.ManagedDataAccess.dll
Oracle.ManagedDataAccessDTC.dll
tutti insieme, a enorme 6,4 MB per .Net 4.0.
Utilizzo il metodo suggerito da Pandicus sopra, su Windows XP, utilizzando ODAC 11.2.0.2.1.I passi sono come segue:
- Scarica il pacchetto "ODAC 11.2 Release 3 (11.2.0.2.1) with Xcopy Deployment" da oracle.com (53 MB) ed estrai lo ZIP.
- Raccogli le seguenti DLL:oci.dll (1 MB), oraociei11.dll (130 MB!), OraOps11w.dll (0,4 MB), Oracle.DataAccess.dll (1 MB).Il materiale rimanente può essere eliminato e non è necessario installare nulla.
- Aggiungi un riferimento a Oracle.DataAccess.dll, aggiungi
using Oracle.DataAccess.Client;
al tuo codice e ora puoi usare tipi comeOracleConnection
,OracleCommand
EOracleDataReader
per accedere a un database Oracle.Vedi il documentazione di classe per dettagli.Non è necessario utilizzare il file di configurazione tnsnames.ora, solo il file stringa di connessione deve essere impostato correttamente. - Le 4 DLL precedenti devono essere distribuite insieme all'eseguibile.
In questo modo puoi connetterti con ODP.net utilizzando 5 file ridistribuibili da Oracle:
Modificare:Nel caso in cui il blog dovesse interrompersi, ecco un breve riepilogo...
- oci.dll
- Oracle.DataAccess.dll
- oraociicus11.dll
- OraOps11w.dll
- orannzsbb11.dll
- oraocci11.dll
- ociw32.dll
assicurati di ottenere TUTTE quelle DLL dalla stessa distribuzione ODP.Net/ODAC per evitare conflitti tra i numeri di versione e inseriscili tutti nella stessa cartella del tuo EXE
DevArt http://www.devart.com/, in precedenza CoreLab (crlab.com) fornisce un client Oracle in puro C#.È una singola DLL e funziona bene.
Ecco un aggiornamento per Oracolo 11.2.0.4.0.Ho avuto successo con la seguente procedura Windows 7 utilizzando System.Data.OracleClient
.
1. Scaricamento Pacchetto client istantaneo - Basic Lite: Windows a 32 bit O 64 bit.
2. Copia i seguenti file in una posizione nel percorso di sistema:
32 bit
1,036,288 2013-10-11 oci.dll
348,160 2013-10-11 ociw32.dll
1,290,240 2013-09-21 orannzsbb11.dll
562,688 2013-10-11 oraocci11.dll
36,286,464 2013-10-11 oraociicus11.dll
64 bit
691,712 2013-10-09 oci.dll
482,304 2013-10-09 ociw32.dll
1,603,072 2013-09-10 orannzsbb11.dll
1,235,456 2013-10-09 oraocci11.dll
45,935,104 2013-10-09 oraociicus11.dll
3. Costruisci una stringa di connessione that omette la necessità di tnsnames.ora.
(Vedi esempi nel programma di test di seguito.)
4. Esegui questo programma C# minimo per testare la tua installazione:
using System;
using System.Data;
using System.Data.OracleClient;
class TestOracleInstantClient
{
static public void Main(string[] args)
{
const string host = "yourhost.yourdomain.com";
const string serviceName = "yourservice.yourdomain.com";
const string userId = "foo";
const string password = "bar";
var conn = new OracleConnection();
// Construct a connection string using Method 1 or 2.
conn.ConnectionString =
GetConnectionStringMethod1(host, serviceName, userId, password);
try
{
conn.Open();
Console.WriteLine("Connection succeeded.");
// Do something with the connection.
conn.Close();
}
catch (Exception e)
{
Console.WriteLine("Connection failed: " + e.Message);
}
}
static private string GetConnectionStringMethod1(
string host,
string serviceName,
string userId,
string password
)
{
string format =
"SERVER=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST={0})(PORT=1521))" +
"(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SERVICE_NAME={1})));" +
"uid={2};" +
"pwd={3};"; // assumes port is 1521 (the default)
return String.Format(format, host, serviceName, userId, password);
}
static private string GetConnectionStringMethod2(
string host,
string serviceName,
string userId,
string password
)
{
string format =
"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST={0})(PORT=1521))" +
"(CONNECT_DATA=(SERVER=DEDICATED)" +
"(SERVICE_NAME={1})));" +
"User Id={2};" +
"Password={3};"; // assumes port is 1521 (the default)
return String.Format(format, host, serviceName, userId, password);
}
}
Consiglio finale: Se riscontri l'errore "System.Data.OracleClient richiede il software client Oracle versione 8.1.7", Vedere questa domanda.
ODAC xcopy ti porterà via con circa 45 MB.http://www.oracle.com/technology/software/tech/windows/odpnet/index.html
Ho trovato molto utile anche questo post sul forum Oracle:
Come configurare Oracle Instant Client con Visual Studio
Nota:il team ADO.NET sta deprecando System.Data.OracleClient quindi per i progetti futuri dovresti usare ODP.NET
Riproduzione:
Imposta le seguenti variabili di ambiente:
- assicurati che nessun'altra directory Oracle sia nel tuo PERCORSO
- imposta il tuo SENTIERO per puntare al tuo client istantaneo
- imposta il tuo TNS_ADMIN per indicare dove si trova il file tnsnames.ora
- imposta il tuo NLS_LANG
- imposta il tuo ORACLE_HOME al tuo client istantaneo
Per quanto mi riguarda, ho impostato NLS_LANG su
http://download-east.oracle.com/docs/html/A95493_01/gblsupp.htm#634282
Ho verificato che si utilizzasse il software client corretto utilizzando il componente aggiuntivo sqlplus per il client istantaneo.
Per me ho impostato:IMPOSTA NLS_LANG=AMERICA_AMERICA.WE8MSWIN1252
Nota:prima di apportare qualsiasi modifica, esegui il backup della chiave di registro Oracle (se esistente) ed esegui il backup della stringa per eventuali variabili di ambiente.