2016-08-31 2 views
1

나는 처음 PetaPoco를 사용하여,이 오류 받고 있어요 ... 주어진 다음과 같은 문제에 대한 답변에 따르면PetaPoco "이미 열려있는 DataReader가"콘솔 응용 프로그램에서

An unhandled exception of type 'System.InvalidOperationException' occurred in Anonymiser.exe. Additional information: There is already an open DataReader associated with this Command which must be closed first. 

    How to create a DAL using Petapoco

  • There is already an open DataReader associated with this Command
  • ...이 제안은 문제 위스콘신입니다 여러 요청을 동일한 데이터베이스/리소스에 있지만 그들의 솔루션은 요청 당 하나의 db 연결을 사용하는 것입니다, 나는 복잡한 웹 응용 프로그램이 아니며, 단일 스레드 콘솔 응용 프로그램을 실행하고 있으며 웹 응용 프로그램 하나의 요청으로 여러 쿼리와 업데이트가 필요합니다 (내가하고있는 것과 비슷합니다, select, loop results, update on each row).

    아래의 관련 코드를 게시했습니다. 첫 번째 비트는 기본적으로 "쿼리"를 호출하여 테이블 밖으로 모든 데이터를 가져옵니다 (임의로하려는 데이터의 데이터베이스 구조를 알지 못하도록 디자인되었습니다).), 그때

    //select all data in a table 
    // non-generic version :: db.query<db_table>("select * from db_tableName");       
    var typedMethod = queryMethodInfo.MakeGenericMethod(t); 
    var allRows = typedMethod.Invoke(db, new Object[] { "select * from " + tableName, null }); 
    
    //then loop through the data 
    foreach (var item in (allRows as IEnumerable)) 
    { 
        string primaryKey; 
        if (findPrimaryKey(item, out primaryKey)) // no primary key no update 
        { 
         // randomize the data here 
         DataRandomizer.ProcessObject(item); 
    
         // push data back to the database 
         db.Update(tableName, primaryKey, item);  
        } 
    } 
    

    내가 '가까운'모든 작업 후 연결을해야 ...과 같이, 삽입 된 각 행과 "업데이트"를 임의의 데이터 후 각 행의 데이터를 변경? 각 SQL 작업에 대해 새로운 PetaPoco.Database 개체를 생성해야합니까? 그것은 answer에 의해 제안 된 해결책이 될 솔기가 없다. 이것은 1 개의 요청은 1 개의 연결을 의미하고, 연결은 공유되어 있으며 이것은 이미 아무 것도 공유하지 않는 단일 스레드 콘솔 앱임을 시사한다.

    업데이트 : 그냥이 ... 광기를 시도했지만 작동, 누군가가 나에게 온건 한 해결책을주세요

    (new PetaPoco.Database("DBConnectString")).Update(tableName, primaryKey, item); 
    
  • +0

    각 작업마다 연결을 닫거나 한 번 연결을 열고 모든 작업에 사용할 수 있습니다. – Reddy

    +0

    @ Reddy @Reddy 방금 작업 한 코드로 제 질문을 업데이트했습니다. 그러나이 작업을 수행하는 데 필요한 일종의 솔루션이라고 생각하지 않습니다. – Nnoel

    +0

    @Reddy, 실제로 "한 번 연결 열기"는 정확하게 내가 한 일입니다. – Nnoel

    답변

    3

    스왑 FetchQuery의 사용. 그 이유는 Fetch이 작업을 수행하고 완전히 채워진 컬렉션을 반환하기 때문입니다. 반면 Query은 결과 집합을 나열 할 때 결과를 가져옵니다.

    오류의 원인은 연결을 열어 DataReader이므로 오류 상태로 수행 할 수없는 결과를 가져 오는 동안 다른 DB 요청을 실행하려고하는 것입니다. 이것이 결과를 앞당길 필요가있는 이유입니다.

    +0

    이 작동하는 각 업데이트에 대한 새로운 스 니펫 호출은 '새 것'입니다.이 질문은 정답입니다. 내 문제가 해결되었습니다. – Nnoel