Доступ к Oracle из программы C#

Я был бы признателен за любой совет по решению этой проблемы.
Я не профессиональный разработчик, а «любитель», который «унаследовал» работу по составлению отчетов (благодаря моему интересу к программированию — классический пример «никогда не добровольно»!) .

Я пытаюсь получить доступ к базе данных Oracle 10g из C#.
Чтобы все было максимально просто, у меня есть голая форма WPF с одной кнопкой. Внутри события нажатия кнопки у меня есть следующий код (который, кстати, отлично работал в более ранней программе, установленной на другом ПК):

using System.Data;
using System.Data.OracleClient;

...

string oraStr1 = "Data Source=(DESCRIPTION=(ADDRESS_LIST =(ADDRESS=(PROTOCOL=TCP)(HOST=myHost)(PORT=myPort)))(CONNECT_DATA=(SERVICE_NAME=myDB)));Password=myPassword;User ID=myUser;";

DataTable oraTable = new DataTable();
string queryString = "Select surname,forenames from person table where surname = 'Smith'";

using ( OracleConnection oraConnect = new OracleConnection( oraStr1 ) )
{
    try
    {
        OracleCommand OraCmd = new OracleCommand( queryString, oraConnect );  
        oraConnect.Open();

        OracleDataAdapter OraAdapter = new OracleDataAdapter();
        OraAdapter.SelectCommand = OraCmd;

        OraAdapter.Fill( oraTable );
    }
    finally
    {
        oraConnect.Close();
    }

Теперь... приложение (C# Express Edition) выполняется на виртуальной машине на удаленном сервере. На моем общем ресурсе на этой ВМ также был установлен клиент Oracle Database 10g Release 2 (10.2.0.1.0).

Кроме того, ИТ-отдел установил у меня компоненты доступа к данным Oracle.

При запуске ODBCAD32 на виртуальной машине драйверы Oracle не отображаются на вкладке драйверов.

Я считаю, что установленный драйвер неисправен, и это не позволяет моей программе инициировать какое-либо соединение. Тем не менее, у меня нет доказательств, и мне интересно, могут ли здесь знающие люди посоветовать, как получить...?

Первые несколько строк сообщения об ошибке IDE гласят:

System.Exception was unhandled
Message="OCIEnvCreate failed with return code -1 but error message text was not available."
Source="System.Data.OracleClient"
StackTrace:
     at System.Data.OracleClient.OciHandle..ctor(OciHandle parentHandle, HTYPE handleType, MODE ocimode, HANDLEFLAG handleflags)
     at System.Data.OracleClient.OracleInternalConnection.OpenOnLocalTransaction(String userName, String password, String serverName, Boolean integratedSecurity, Boolean unicode, Boolean omitOracleConnectionName)
     at System.Data.OracleClient.OracleInternalConnection..ctor(OracleConnectionString connectionOptions)
     at System.Data.OracleClient.OracleConnectionFactory.CreateConnection(DbConnectionOptions options, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningObject)
     at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnection owningConnection, DbConnectionPool pool, DbConnectionOptions options)
     at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject)
     at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject)
     at System.Data.ProviderBase.DbConnectionPool.GetConnection(DbConnection owningObject)
     at System.Data.ProviderBase.DbConnectionFactory.GetConnection(DbConnection owningConnection)
     at System.Data.ProviderBase.DbConnectionClosed.OpenConnection(DbConnection outerConnection, DbConnectionFactory connectionFactory)
     at System.Data.OracleClient.OracleConnection.Open()    

Извините за многословие, но, как видите, эта настройка довольно сложна... :)

Я не имею права рассказывать ИТ об их работе, но был бы признателен за любые советы, которые я мог бы передать?


person steve    schedule 16.11.2011    source источник


Ответы (3)


Я бы рекомендовал не сходить с ума от провайдеров данных и кастомных sql.

Получите ORM, поддерживающий Oracle (например, NHibernate), и пусть он выполняет свою работу. Ваша единственная забота будет заключаться в сопоставлении таблиц с вашими объектами, а затем писать запросы на нейтральном языке (теперь nhibernate поддерживает выражения linq и lambda, так что это не может быть проще).

Удачного кодирования :)

person Matteo Mosca    schedule 16.11.2011

С ADO.Net меня не удивит, что драйверы Oracle не отображаются в апплете ODBC — вы используете соединение OLEDB, которое отличается от ODBC.

Похоже, вы используете System.Data.OracleClient, который является клиентом Oracle от Microsoft, а не от Oracle Corp. Этот клиент устарел (Microsoft прекратит его поддержку в будущем), и я бы не рекомендовал вам используй это.

Взгляните на пример кода здесь: http://www.carlprothman.net/Default.aspx?tabid=86#OracleNETDataProviderFromOracle

или здесь:

http://www.connectionstrings.com/Providers/oracle-provider-for-ole-db-oraoledb

Вот несколько примеров строк подключения: http://www.connectionstrings.com/oracle

person JMarsch    schedule 16.11.2011

Вот как я это делаю, но мне нужно найти новые способы, потому что часть OracleClient устарела в 4.0 и 4.5.

string sqlquery = "select * from person"; 
DataGridView1.DataSource = PullTableResults(sqlquery);

private static DataTable PullTableResults(string sqlquery)
{
   try
   {
       if (showMessages)
       {
           MessageBox.Show(sqlquery);
       }

       var conn = new OracleConnection(Oradb);
       conn.Open();
       var cmd = new OracleCommand(sqlquery, conn);
       cmd.CommandType = CommandType.Text;
       var dr = cmd.ExecuteReader();
       var read = dr.Read();
       var table = new DataTable();
       var oda = new OracleDataAdapter(cmd);
       int fill = oda.Fill(table);
       conn.Close();
       conn.Dispose();
       return table;
   }
   catch (Exception ex)
   {
       const string Message = "Database Exception";

       if (showMessages)
       {
           MessageBox.Show(Message + ex);
       }

       var table = new DataTable();
       return table; // return empty table cause there was error
   }

}

person Community    schedule 30.05.2013