2016-10-18 2 views
1

Poco 라이브러리가있는 MySQL 테이블에 행이 있는지 확인하려고합니다.Poco로 EXISTS 값 선택

session << "SELECT COUNT(*) FROM %s WHERE Serial=?", 
    into(n), // int 
    tableName, // string 
    use(serial), now; 

다음 n==0 여부를 확인 : 작동이 일을

한 가지 방법은있다.

그러나, 이렇게 명확 (빠르게) 방법

session << "SELECT EXISTS(SELECT * FROM %s WHERE Serial = ?)", 
    into(n), 
    tableName, 
    use(serial), now; 
n의 값은 다음 것

0 또는 1이 될 것이고, 그러나 (!pBinder.isNull())을 실행시 어설 예외가 발생 . 이는 nint 또는 bool (EXISTSBOOLEAN을 반환하므로보다 적절할 수 있음)과 관계없이 발생합니다.

내 바인딩에 문제가있는 경우 (이 바인딩이 이전에 수행 한 다른 쿼리와 동일 함에도 불구하고 오류가 암시하는 것처럼) RecordSet을 사용하여이 테스트를위한 모든 바인딩을 일시적으로 제거하려고 시도했지만, 그것을 화면에 인쇄합니다.

session << "SELECT EXISTS(SELECT * FROM TestTable WHERE Serial = 'XXX')", now; 
RecordSet r(exists); 
cout << r; 

쿼리와 RecordSet의 구조는 잘 작동하는 것,하지만 난 콘솔에 인쇄하려고하면 Poco::BadCastException가 발생합니다.

이렇게하려면 Poco로 수행 할 수 있습니까? 아니면 계속 SELECT COUNT(*) 메서드를 사용해야합니까?

답변

0

그래서 Poco를 사용하지 않으므로 이에 대해 언급 할 수 없습니다. 그러나 직접 작동하도록 관리 할 수 ​​없다면 count(*)에 의존하지 마십시오. 큰 테이블에서 작업이 훨씬 느립니다. 최악의 경우, 당신은 같은 것을 할 것입니다 :

select if(exists(select 1 from %s where Serial=?), 1, 0)

또는 다른 어떤 값이 truefalse 위해 가지고 싶습니다.

+0

팁 주셔서 감사합니다.하지만 그 중 하나가 작동하지 않습니다. – Wasabi