Доступ к Oracle из программы C # - PullRequest
0 голосов
/ 16 ноября 2011

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

Я пытаюсь получить доступ к базе данных 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 Client 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()    

Извините, что так затянуто, но, как вы видите, эта установка довольно сложна ... :)

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

Ответы [ 3 ]

0 голосов
/ 16 ноября 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

0 голосов
/ 30 мая 2013

Вот как я это делаю, но мне нужно найти новые пути, потому что часть 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
   }

}

0 голосов
/ 16 ноября 2011

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

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...