2016-10-06 10 views
0

MySQL에서 last_insert_id 및 관련 문제를 얻는 방법에 대한 게시물이 여러 개 있습니다. DBExpress와 관련된이 게시물을 찾았습니다. delphi dxExpress MySQL: invalid LAST_INSERT_ID valueDBExpress 및 mysql 마지막 삽입 ID

그러나 다음 게시물을 참고하면 메모 테이블에 메모를 삽입하는 데 도움이되지 않습니다.

TSQLQuery* tq = new TSQLQuery(NULL); 
tq->SQLConnection = atdbDM->SQLConnection1; 

stringstream q; 
q <<"INSERT INTO note (created_by, note) VALUES ("<<1234<<", \'<none>\');"; 
q << "SELECT LAST_INSERT_ID() AS lastNoteID;"; 
tq->SQL->Add(q.str().c_str()); 
tq->Open(); 
int noteID = tq->FieldByName("lastNoteID")->AsInteger; 
tq->Close(); 

열기()를 실행하면, 나는 예외가 얻을 : 내가 처음 삽입 문을 실행하면

'You have an error in your SQL syntax; Check the manual that correposnds to your MySQL server version for the right syntax to use near 'SELECT LAST_INSERT_ID... at line1' 

을 개별적으로 SELECT 문, 나는 오류를 얻을 수 없지만, 반환 된 ID는 항상 0. 변경해야 할 사항을 아는 사람은 누구입니까? 나는 C++ Builder XE3을 사용하고있다.

+0

LAST_INSERT_ID()는 성공적으로 삽입 된 마지막 삽입 된 ID입니다. 레코드가 삽입되거나 업데이트되지 않으면이 값은 변경되지 않습니다. MySQL 사이트에 대한 많은 토론. 데이터 필드에 의해 레코드를 찾은 다음 ID 필드를로드하고 LAST_INSERT_ID()를 신뢰하지 않습니다. –

+0

여기의 문제는 LAST_INSERT_ID() 그 자체가 아닙니다. 문제는 DBExpress와 MySQL의 조합으로 위 쿼리가 유효하지 않다는 결론을 얻은 것 같습니다. id에 대해 0을 얻는 것은 종종 두 개의 다른 세션에 속하는 별도의 쿼리와 관련이있는 것처럼 보입니다. –

답변

0

나는 다중 세션이 만들어지지 않도록 last_insertid 함수가 항상 0을 반환하는 것을 알아 냈다. 연결 AUTOCLONE 매개 변수를 false로 설정할 수있다. 그런 다음 마지막 삽입 ID 함수가 올바르게 작동합니다. 예 :

MySQLConnection->Connected = true; 
MySQLConnection->AutoClone = false; //<- makes last_insert_id work as expected!