Поставщик OraOledb.Oracle через ASP.NET
Вопрос: Почему мой локальный код может выполнять соединение ORAOleDB.Oracle, но я не могу найти провайдера при запуске анонимного выполнения на тех же веб-сайтах IIS компьютеров.
Поэтому я публикую веб-сайт на своем локальном компьютере для подключения к различным базам данных. Код работает нормально при подключении к базе данных и возвращает код ошибки, который я анализирую. Я просто хочу убедиться, что прослушиватель TNS включен, а прослушиватель Oracle не подключен к нему.
Локально: код проходит
Нажмите на IIS: код ошибки
Однако, когда я публикую код в своем IIS и запускаю тот же самый точный код, я получаю поставщика OraOledb.Oracle, не найденного на локальной машине.
Когда я публикую свой веб-сайт, я получаю следующее сообщение для каждой базы данных Oracle, которую я пробую:
The 'OraOLEDB.Oracle' provider is not registered on the local machine.
I have registered the dll:
cd C:\ProgramData\oracle\oracle11g\BIN
regsvr32 OraOLEDB11.dll
Следующие разрешения для папки, где установлен Oracle
C:\ProgramData\oracle has the following users:
IIS AppPool\DefaultAppPool
IIS_IUSRS
IIS AppPool\ASP.NET v4.0
All these users have Full Control
Мой код выглядит следующим образом. Очень просто, он просто берет имя базы данных и создает фиктивную строку.
private void ExecuteDatabase(string database)
{
string openstring = "Provider=OraOLEDB.Oracle;Data Source=" + database + ";User Id=x_dummy;Password=x_dummy;Connection Timeout=5;";
string msg = String.Empty;
string Elapsed = String.Empty;
string Result = String.Empty;
using (OleDbConnection connection = new OleDbConnection(openstring))
{
//Timestamp for elapsed time counting
DateTime stTime = DateTime.Now;
try
{
// Try to connect. If succeed, then close, and create
// an OK message. x_dummy user and password is improbabile.
// If connection not successfull, there issued an Oracle
// exception. We need to parse the exception.
//connection.ConnectionTimeout = 5;
System.Diagnostics.Debug.WriteLine("Connection Open");
connection.Open();
System.Diagnostics.Debug.WriteLine("Connection Opened");
// If succeeded...
msg = "OK";
//.. then closes
connection.Close();
}
// If connection is not succesfull, we get the errormessage.
catch (Exception ex)
{
//We need the first part of message, this is an Oracle message like this: ORA-01017
//msg = ex.Message.Split(':')[0];
msg = ex.Message;
}
//Timestamp for elapsed time counting
DateTime etTime = DateTime.Now;
//Calculate the elapsed time
TimeSpan ts = etTime - stTime;
//Get the millisecs from elapsed time
Elapsed = ts.Milliseconds.ToString();
//Get the Result String
Result = "{" + databaseResult(msg.Split(':')[0]) + "}";
Result = Result + msg;
}
}
private String databaseResult(string msg)
{
string ret = String.Empty;
switch (msg)
{
//kind os listener answers
case "ORA-12154":
ret = "No Oracle listener found";
break;
case "ORA-12514":
ret = "No TNS listener found";
break;
case "ORA-12541":
ret = "No listener ";
break;
//ORA-01017 is only good response for us. It means
//that listener is good, but username and passwor is not.
//This procedure gives back OK message and elapsed time in this case
case "ORA-01017":
ret = String.Format("OK");
break;
case "OK":
ret = String.Format("OK");
break;
//In default case this procedure doesn't found listener.
default:
ret = "No Oracle listener found";
break;
}
//returns the result of connection
return ret;
}