programing

오라클이 왜?Oracle에서는 ManagedDataAccess가 작동하지 않습니다.Data Access는 무엇을 합니까?

randomtip 2023. 3. 22. 22:56
반응형

오라클이 왜?Oracle에서는 ManagedDataAccess가 작동하지 않습니다.Data Access는 무엇을 합니까?

몇 대의 머신에서 발생하고 있는 문제의 트러블 슈팅에 사용하는 매우 간단한 애플리케이션을 개발하고 있습니다만, 그 전에 CPU 아키텍처의 차이와 Oracle 데이터베이스 라이브러리 등 몇 가지 문제가 발생했습니다.

는 에 .tnsnames.ora 방에 있다C:\oracle\11g\network\admin디렉토리로 이동합니다.이 서버에 접속하면 원하는 응답을 얻을 수 있습니다.Oracle을 사용하여 이 서버에 접속하기 위해 C# 프로그램을 코드화한 경우. 합니다.라이언,,,작작작

string connectionString = "Data Source=DSDSDS;User Id=UNUNUN;Password=PWPWPW;";
DataTable dataTable = new DataTable();

using (var connection = new OracleConnection(connectionString)) {
    connection.Open();
    using (var command = new OracleCommand()) {
        command.Connection = connection;
        command.CommandText = sql;
        command.CommandType = CommandType.Text;
        using (var oda = new OracleDataAdapter(command)) {
            oda.Fill(dataTable);
        }
    }
}

Oracle. ,, Oracle.Data Access(데이터 액세스) Data Access(데이터 액세스)나는 다른 도서관 오라클이 있는 것을 보았다.「Managed Data Access(관리 데이터 액세스)」.이 라이브러리를 사용하면 서버에 접속할 수 없게 됩니다.ORA-12545: Network Transport: Unable to resolve connect hostname집니니다

왜 그럴까?이 두 라이브러리의 차이점은 지금까지 읽은 내용에 따르면 이것은 문제가 되지 않을 것이기 때문입니다.

추가 정보:

  • %ORACLE_HOME% 및 %TNS_ADMIN%는 정의되어 있지 않습니다(tnsping 및 Oracle에 유의하십시오).Data Access 작업)
  • 에는 PATH가 있습니다.C:\oracle\11g\BIN정의되어 있습니다.
  • .tnsnames.ora

파일과 .tnsnames.ora .exe는 합니다.오라클 ★★★★★★★★★★★★★★★★★★★★?는 Data Access의 합니다.C:\oracle\11g\network\admin오라클Managed Access ( Managed Access ) 。

ODP에서 TNS 이름을 해결하기 위한 우선순위.NET, Managed Driver는 다음과 같습니다(여기를 참조).

  1. 데이터 소스 에일리어스는 의 섹션 아래에 있는 'dataSources' 섹션에 있습니다.NET 컨피규레이션파일
  2. 'TNS_ADM'에 의해 지정된 위치에 있는 tnsnames.ora 파일의 데이터 소스 별칭안에 있습니다.NET 컨피규레이션파일
  3. .exe와 같은 디렉토리에 있는 tnsnames.ora 파일의 데이터 소스 에일리어스.
  4. tnsnames.ora 파일의 데이터 소스 에일리어스가 %TNS_ADMIN%에 존재합니다(여기서 %TNS_ADM).IN%는 환경변수 설정입니다).
  5. %ORACLE_HOME%\network\admin에 있는 tnsnames.ora 파일의 데이터 소스 에일리어스(%ORACLE_HOME%는 환경 변수 설정).

저는 당신의 샘플이 오라클과 함께 작동하는 이유를 믿습니다.Data Access(Oracle에서는 사용 안 함).Managed Data Access는 Windows 레지스트리 기반 구성이 ODP에서 지원되지 않습니다(문서 참조).NET 설치에서는 관리되지 않는 부분에서만 인식되는ORACLE_HOME 레지스트리 키(HLKM\SOFTWARE\ORACLE\Key_NAME\ORACLE_HOME)가 설정됩니다.

tnsnames.ora로의 경로를 설정 파일에 추가해 보겠습니다.

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <oracle.manageddataaccess.client>
    <version number="4.112.3.60">
      <settings>
        <setting name="TNS_ADMIN" value="C:\oracle\product\10.2.0\client_1\NETWORK\ADMIN\" />
      </settings>
    </version>
  </oracle.manageddataaccess.client>
</configuration>

TNSNAMES(여러 비트의 할 수 .ORA(여러 Oracle 버전과 32/64 비트의 혼동이 추가됨)는 기존 TNSNAMES에서 설정을 복사할 수 있습니다.【설정】【ORA】【ORA】【ORA】【ORA】
TNSNAMES의 'DSDS'입니다.ORA로 하다

DSDSDS=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=RESS)(호스트=DSDSDSDSHost)(포트=4521))(CONNECT_DATA=(SERVICE_NAME=DSSService)))))

You can take the text after the first '=' and use that wherever you are using 'DSDSDS' and it won't need to find TNSNAMES.ORA to know how to connect.
Now your connection string would look like this:
string connectionString = "Data Source=(DESCRIPTION=(ADDRESS_LIST=(ADDRESS=(PROTOCOL=TCP)(Host=DSDSDSHost)(Port=4521)))(CONNECT_DATA=(SERVICE_NAME=DSDSDSService)));User Id=UNUNUN;Password=PWPWPW;";

접속 문자열에서 원하는 포맷을 찾았을 때 Oracle에서는 이와 같이 정상적으로 동작했습니다.Managed Data Access.따로 가지고 놀 필요 없이.

DATA SOURCE=DSDSDS:1521/ORCL;

나도 비슷한 문제가 있었어... 이 문제를 해결하기 위해 ODP를 제거한 거야.oracle 서버와 같은 디렉토리에 넷으로 재설치...서버 옵션을 사용하면 대부분의 제품이 이미 설치되어 있다는 것을 알 수 있습니다(12c 데이터베이스 설치 중).다른 기능을 선택하고 최종적으로 설치를 완료합니다.

이 회피책은, 같은 머신에 12 c를 인스톨 하고 있는 경우(노트북에 12 c 를 인스톨 하고 있는 경우)에만 유효합니다.

데이터베이스가 노트북이 아닌 서버 머신에 있는 경우 서버가 아닌 클라이언트 옵션을 선택한 후 TNS_ADMIN을 app.config에 포함시키고 버전 지정을 잊지 마십시오.

노트북에 설치가 되어 있기 때문에 App.config는 다음과 같습니다.

<?xml version="1.0" encoding="utf-8"?>
<configuration>
    <startup> 
        <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0"/>
    </startup>
</configuration>


 /////////the below code is a sample from oracle company////////////////


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Data.Common;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using Oracle.ManagedDataAccess.Client;

///copy these lines in a button click event 
    string constr = "User Id=system; Password=manager; Data Source=orcl;";
// Click here and then press F9 to insert a breakpoint
        DbProviderFactory factory =
    DbProviderFactories.GetFactory("Oracle.ManagedDataAccess.Client");
            using (DbConnection conn = factory.CreateConnection())
            {
                conn.ConnectionString = constr;
                try
                {
                    conn.Open();
                    OracleCommand cmd = (OracleCommand)factory.CreateCommand();
                    cmd.Connection = (OracleConnection)conn;

//to gain access to ROWIDs of the table
//cmd.AddRowid = true;
                    cmd.CommandText = "select * from all_users";

                    OracleDataReader reader = cmd.ExecuteReader();

                    int visFC = reader.VisibleFieldCount; //Results in 2
                    int hidFC = reader.HiddenFieldCount;  // Results in 1

                    MessageBox.Show(" Visible field count: " + visFC);

                    MessageBox.Show(" Hidden field count: " + hidFC);


                    reader.Dispose();
                    cmd.Dispose();
                }
                catch (Exception ex)
                {
                    MessageBox.Show(ex.Message);
                      MessageBox.Show(ex.StackTrace);
                }
            }

에는 ' 늦었지만은 '조금'입니다Oracle.ManagedDataAccess에서는 ODP와 같은 .NET 프로바이더에서는, 다음과 같은 것은 잊어 주세요.network\admin,Oracle client,Oracle_Home 등등.

여기 당신이 필요한 것이 있습니다.

  1. VS 또는 ODAC용 Oracle Developer Tools를 다운로드하여 설치합니다.참고 - 개발 도구가 ODAC을 설치합니다.이것에 의해, 비교적 소규모의 인스톨이 작성됩니다.C:\Program Files (x86)풀도구 시 미만.
  2. 프로젝트에서는 Nuget 패키지와 대응하는 버전의 ODP.net(Oracle)을 설치합니다.참조하는 Managed Data Access.dll)
  3. 이 시점에서 접속할 수 있는 옵션은 2가지가 있습니다.

    • a) 를 설정합니다.datasource다음과 같은 형식으로

      DataSource=ServerName:Port/SID . . .또는DataSource=IP:Port/SID . . .

    • b) 작성tnsnames.ora파일(이전 경험과는 다릅니다)을 참조해 주세요.엔트리가 있습니다.

      AAA = (설명 =)
      (주소 = (PROTOCOL = TCP)(HOST = ServerNameOr)IP)(PORT = 1521)
      (CONNECT_DATA = (서버 = 전용)(SERVICE_NAME = SIDNAME))

      그리고 이 파일을 응용 프로그램이 실행되는 bin 폴더에 넣습니다.이제 연결 이름을 사용하여 연결할 수 있습니다.DataSource=AAA . . .따라서 tnsnames.ora를 가지고 있어도 ODP.net에서 관리하면 조금 다르게 동작합니다.로컬 TNS 파일을 만듭니다.그리고 이제 관리가 쉬워졌습니다.

요약하자면, 관리 대상이기 때문에 무거운 Oracle Client가 필요하지 않습니다.Oracle_home오라클모든 것을 .net 어플리케이션 구조 내에서 실행할 수 있습니다.

Oracle을 제거하는 중입니다.Managed Data Access는 Oracle만 남습니다.Managed Data Access.코어는 나한테 효과가 있어.

에는 위의 , 까지는 '아예'라는 문구를 .ORA-12545: Network Transport: Unable to resolve connect hostname

Oracle 머신에 ping을 실행하려고 했는데 표시되지 않아 호스트 파일에 추가했습니다. 또 .ORA-12541: TNS:no listener조사 결과, 다른 머신으로부터 같은 호스트명을 ping 하면, 다른 IP 주소가 취득되는 것을 알게 되어(이유는 알 수 없습니다), 호스트 파일의 IP 주소를 변경해, 100%로 문제가 해결되었습니다.

제 경험을 적는 것은 당연한 일이지만, 문제가 위의 설정에 있는 것은 확실합니다만, 정말로 리모트 DB 머신을 볼 수 있는지 확인하는 것을 완전히 잊고 있었습니다.무슨 일이 일어나고 있는지 모를 때는 기억해 두세요.

이러한 링크가 큰 도움이 되었습니다.

http://www.moreajays.com/2013/03/ora-12545-connect-failed-because-target.html http://www.orafaq.com/wiki/ORA-12541

같은 에러 메시지를 받았습니다. 저는 '이것'을 '이것'으로 했습니다.Oracle.ManagedDataAccess '와의 조합Oracle.DataAccess새로운 하지 않을 수 .새 어셈블리에서 발견된 새 기능이 필요한 경우 이 솔루션이 작동하지 않을 수 있습니다. 설정을 보다 우선순위가 가 더 .Oracle어셈블리

언급URL : https://stackoverflow.com/questions/17456024/why-would-oracle-manageddataaccess-not-work-when-oracle-dataaccess-does

반응형