Najlepszym rozwiązaniem, jakie znalazłem, było użycie biblioteki Oracle Data Access Client i uwzględnienie całego wpisu nazw TNS w ciągu połączenia. Dzięki temu projekt można łatwo opublikować na serwerze internetowym, ClickOnce itp.
Oto kroki niezbędne do skonfigurowania sterownika Oracle działającego w Twoim projekcie:
1) Pobierz biblioteki DLL z pakietu „Oracle Data Provider for .NET”
Pobierz plik instalatora z tej lokalizacji:http://www.oracle. com/technetwork/topics/dotnet/index-085163.html
Poszedłem dalej i zainstalowałem pełny 200 MB ODAC z Oracle Developer Tools for Visual Studio, ale tak naprawdę potrzebujesz tylko czterech bibliotek DLL z tego pobrania. (Możesz być w stanie wyodrębnić je bezpośrednio z pakietu instalacyjnego, zamiast przechodzić przez cały proces instalacji, lub być może jedno z mniejszych plików do pobrania zawiera je wszystkie.)
2) Odwołaj się do bibliotek DLL w swoim projekcie
Przeszukaj katalog instalacyjny Oracle Data Access Client i przeciągnij następujące cztery biblioteki DLL do katalogu głównego projektu:
- Oracle.DataAccess.dll
- oci.dll
- oraciicus11.dll
- OraOps11w.dll
Ustaw Kopiuj do katalogu wyjściowego właściwość wszystkich plików z wyjątkiem Oracle.DataAccess.dll do Kopiuj zawsze .
W sekcji Projekt --> Dodaj odniesienie... , kliknij Przeglądaj i wybierz plik Oracle.DataAccess.dll.
3) Użyj sterownika z pełnymi parametrami połączenia (opcjonalnie)
Aby nie martwić się konfiguracją plików nazw TNS na komputerach, na których aplikacja została wdrożona, umieściłem całą definicję w pliku, tak jak pokazuje connectionstrings.com . To sprawia, że ciąg połączenia jest trochę nieporęczny, ale usunęło wiele problemów związanych z plikami TNS Names, których doświadczałem wcześniej:
Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(HOST=servername)(PORT=1521)))(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));User Id=username;Password=********;
Oto pełna klasa, której użyłem do przetestowania sterownika:
using System;
using System.Data;
using Oracle.DataAccess.Client;
static class Program
{
[STAThread]
static void Main()
{
TestOracle();
}
private static void TestOracle()
{
string connString =
"Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)" +
"(HOST=servername)(PORT=1521)))" +
"(CONNECT_DATA=(SERVER=DEDICATED)(SERVICE_NAME=servicename)));"+
"User Id=username;Password=********;";
using (OracleConnection conn = new OracleConnection(connString))
{
string sqlSelect = "SELECT * FROM TEST_TABLE";
using (OracleDataAdapter da = new OracleDataAdapter(sqlSelect, conn))
{
var table = new DataTable();
da.Fill(table);
if (table.Rows.Count > 1)
Console.WriteLine("Successfully read oracle.");
}
}
}
}