2017-12-20 1 views
0

IBM.EntityFrameworkCore를 사용하여 IBM iSeries에 상주하는 DB2 파일/테이블에서 데이터를 가져 오려고합니다. 내가 그 길을 따라 문제에 부딪쳤던 것처럼 보인다. 그들 중 대부분은이 사이트에 대한 의견을 읽음으로써 일할 수 있었지만,이 사이트에서 나를 도울 수있는 것을 찾을 수는 없습니다. 그것을 가리 키도록 1.1.1.101 오류 Visual Studio 2017의 DB2 iSeries에서 데이터를 가져 오는 SQL30061N IBM.EntityFrameworkCore를 사용하는 C#

  • 내 PATH 환경 변수를 업데이트 닷넷 코어
  • 설치된 IBM.EntityFrameworkCore 버전에 대한 새 콘솔 응용 프로그램 프로젝트를 만든

    1. :

      나는 다음과 같은 단계를 수행했습니다 C : ₩ Users ₩ MyUserName.nuget ₩ packages ₩ ibm.data.db2.core ₩ 1.1.1.101 ₩ build ₩ clidriver ₩ bin

    2. 에서 db2level 명령을 사용하여 올바른 드라이버가 설치되고로드되었는지 확인하십시오. 명령 프롬프트.
    3. 콘솔 앱 프로젝트 내에서 iSeriesContext.cs, SYSVARIABLES.cs 및 Program.cs라는 세 개의 클래스를 만들었습니다.

    테스트 목적으로 iSeries에서 DB2와 함께 표준으로 제공되는 시스템 스키마/데이터베이스를 사용하고 있습니다.

    Program.cs에는 다음이 포함

    using System.Linq; 
    
    namespace ConsoleApp1 
    { 
        class Program 
        { 
         static void Main(string[] args) 
         { 
          iSeriesContext context = new iSeriesContext(); 
          var results = context.SYSVARIABLES.Where(p => p.VARIABLE_NAME == "test").FirstOrDefault(); 
         } 
        //enter code here 
        } 
    } 
    

    iSeriesContext.cs가 포함

    using System; 
    using Microsoft.EntityFrameworkCore; 
    using System.Linq; 
    using IBM.EntityFrameworkCore; 
    using IBM.EntityFrameworkCore.Storage.Internal; 
    
    namespace ConsoleApp1 
    { 
        public class iSeriesContext : DbContext 
        { 
         public iSeriesContext() : base() { } 
         public DbSet<SYSVARIABLE> SYSVARIABLES { get; set; } 
    
         protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 
         { 
          optionsBuilder.UseDb2(@"server=192.0.0.1:446; Database=QSYS2; userid=username; password=password", p => p.SetServerInfo(IBMDBServerType.AS400, IBMDBServerVersion.AS400_07_01)); 
         } 
        } 
    } 
    

    SYSVARIABLE.cs가 포함

    using System.Collections.Generic; 
    using System.ComponentModel.DataAnnotations; 
    using System.Linq; 
    using System.Text; 
    using System.Threading.Tasks; 
    
    namespace ConsoleApp1 
    { 
        public class SYSVARIABLE 
        { 
         [Key] 
         public string VARIABLE_SCHEMA { get; set; } 
         public string VARIABLE_NAME { get; set; } 
         public string SYSTEM_VAR_SCHEMA { get; set; } 
        } 
    } 
    

    추가 정보 :

    나는 conf를 가졌다. 내 iSeries OS는 V7R1입니다.

    iSeries의 내 drda 서비스가 포트 446에서 청취하고 있고 코드를 실행할 때 "마지막 활동 날짜/시간"이 현재 시간으로 갱신되었음을 확인했습니다.

    솔루션은 오류없이 컴파일됩니다. 나는 그것을 실행할 때, 나는 오류의

    "IBM.Data.DB2.Core.DB2Exception: 'External component has thrown an exception.'" error on this line "var results = context.SYSVARIABLES.Where(p => p.VARIABLE_NAME == "test").FirstOrDefault();" in Program.cs 
    

    세부 항목은 얻을 : 나는 매우 가까운 것 같은

    IBM.Data.DB2.Core.DB2Exception occurred 
        HResult=0x80004005 
        Message=ERROR [08004] [IBM] SQL30061N The database alias or database name 
    
    "QSYS2    " was not found at the remote node. SQLSTATE=08004 
        [IBM] SQL30061N The database alias or database name "QSYS2    " was not found at the remote node. SQLSTATE=08004 
    
        Source=<Cannot evaluate the exception source> 
        StackTrace: 
        at IBM.Data.DB2.Core.DB2ConnPool.Open(DB2Connection connection, String& szConnectionString, DB2ConnSettings& ppSettings, Object& ppConn) 
        at IBM.Data.DB2.Core.DB2Connection.Open() 
        at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open() 
        at Microsoft.EntityFrameworkCore.Query.Internal.QueryingEnumerable.Enumerator.BufferlessMoveNext(Boolean buffer) 
        at Microsoft.EntityFrameworkCore.Query.QueryMethodProvider.<_ShapedQuery>d__3`1.MoveNext() 
        at System.Linq.Enumerable.TryGetFirst[TSource](IEnumerable`1 source, Boolean& found) 
        at Microsoft.EntityFrameworkCore.Query.Internal.QueryCompiler.<>c__DisplayClass20_0`1.<CompileQueryCore>b__0(QueryContext qc) 
        at System.Linq.Queryable.FirstOrDefault[TSource](IQueryable`1 source) 
        at ConsoleApp1.Program.Main(String[] args) in C:\Users\username\source\repos\IBMEntityFrameworkTest\ConsoleApp1\Program.cs:line 10 
    " 
    

    나는 생각합니다. 어떤 도움을 주시면 감사하겠습니다.

  • +0

    나는 IP를 192.0.0.1에 대한 질문이 야생 IP가 192.168.n.n 또는 10.n.n.n.해야한다입니다 – danny117

    답변

    0

    ODBC를 사용하여이 데이터 소스에 연결할 수 있습니까? 그렇게하면 패키지 라이브러리와 라이브러리 목록을 선택할 수있는 대화 상자가 나타납니다. 메시지는 QSYS2를 찾을 수 없음을 표시합니다. 그래서 그것이 패키지의 올바른 이름이 아닐 수도 있습니다. 아래의 스크린 샷에서 패키지 이름은 "QGPL"입니다.

    일단 ODBC 데이터 소스를 구성했으면 System.Data.Odbc.OdbcConnection과 DSN을 사용하는 연결 문자열을 사용하는 매우 간단한 C# 응용 프로그램을 사용하여 테스트하십시오. 그렇게하면 모든 EF 말도 안되며 찾고있는 데이터를 실제로 읽을 수 있는지 여부를 확인할 수 있습니다. DSN과 연결 문자열을 사용하여 테이블을 읽을 수 있음을 입증하면 EF와 함께 사용할 새 매개 변수가 있는지 확인할 수 있습니다.

    일반 오래된 ODBC를 사용하여 데이터를 읽을 수도 있습니다. 이것이 우리가하는 일입니다. 그런 다음 DSN이 설정되면 우리는 엉뚱한 구문을 넘어서 DB2 넌센스에 대해 걱정할 필요가 없습니다.

    enter image description here

    +0

    ODBC 커넥터를 작성하여 Excel에서 사용하여 필요한 데이터 (QSYS2와 제안 QGPL 모두 사용)를 가져 왔습니다. 또한 VS2007 내에서 .Net Data Provider (QSYS2와 제안 QPGL을 모두 사용하고 iDBConnection, iDBDataAdapter 및 iDBCommand를 사용하여 데이터를 가져올 수있었습니다.) 즉, QSYS2 또는 QGPL 중 하나를 사용하면 동일한 오류가 발생합니다. SQL30061N SQLSTATE = 08004 – Jeff

    +0

    데이터베이스 이름 또는 데이터베이스 이름 "QGPL"이 원격 노드에서 발견되지 않았습니다.이 연결 문자열에서 데이터베이스 이름으로 넣어야한다고 생각하지 않습니다. ODBC에서 무엇을 가지고 있습니까? "SQL 기본 라이브러리"? 이것은 데이터베이스에 사용할 이름 일 수 있습니다. –

    관련 문제