2014-02-08 1 views
0

준비된 문장, 트랜잭션 사용 및 매개 변수화 된 쿼리를 다시 사용하여 절약 코드를보다 효율적으로 만들려고합니다. 그러나 저장 코드를 실행할 때마다 하나의 레코드 만 내 테이블에 저장됩니다. 나는 그것이 sqlite3_step이 놓이는 곳과 관련이 있다고 생각한다.매개 변수가있는 SQLite3 다중 삽입; 단 하나의 레코드가 삽입되었습니다

그러나 나는 또한 다른 눈으로 내 코드를 살펴보고 내가 올바르게하고 있는지 알려주고 싶습니다. 그것은 내가 다양한 주제에 발견 약 6 포럼 게시물 및 스택 오버플로 주제 뒤범벅이 그래서 나는이 어디를 수행하는 예를 찾을 수 없습니다 :

//Planet Data 

//Delete previous save data 
dData("Generated_Planets", bErrors); 

if (plData.size() > 0) 
{ 
    sqlite3_exec(dBase, "BEGIN TRANSACTION", NULL, NULL, &error); 

    sqlStr = "Insert Into Generated_Planets (ID, Name, Affiliation, Disposition, Race, Player_Owned, Is_Destroyed, EKS, Planet_Size, Current_Pop, Max_Pop) Values (?,?,?,?,?,?,?,?,?,?,?);"; 

    if (sqlite3_prepare_v2(dBase, sqlStr.c_str(), sqlStr.size(), &statement, 0) == SQLITE_OK) 
    { 
     cout << "Saving planet data"; 
     //Save new data 
     for (i = 0; i <= plData.size(); i++) 
     { 
      if (i == plData.size()) 
      { 
       finalize(statement, bErrors); 
      } 

      else 
      { 
       sqlI1 = plData.at(i).pID; 
       sqlS1 = plData.at(i).pName; 
       sqlS2 = plData.at(i).pAffiliation; 
       sqlS3 = plData.at(i).pDispo; 
       sqlS4 = plData.at(i).pRace; 
       sqlI2 = plData.at(i).bIsPOwned; 
       sqlI3 = plData.at(i).bIsDestroyed; 
       sqlF1 = plData.at(i).pEKS; 
       sqlF2 = plData.at(i).pSize; 
       sqlLLI1 = plData.at(i).pCPop; 
       sqlLLI2 = plData.at(i).pMPop; 

       find = "'"; 
       temp = "\""; 

       foundAt = sqlS1.find(find); 

       if (foundAt != string::npos) 
       { 
        sqlS1.replace(foundAt,1,temp); 
       } 

       //Bind parameters 
       sqlite3_bind_int(statement,1,sqlI1); 
       sqlite3_bind_text(statement,2,sqlS1.c_str(),sqlS1.size(),SQLITE_TRANSIENT); 
       sqlite3_bind_text(statement,3,sqlS2.c_str(),sqlS2.size(),SQLITE_TRANSIENT); 
       sqlite3_bind_text(statement,4,sqlS3.c_str(),sqlS3.size(),SQLITE_TRANSIENT); 
       sqlite3_bind_text(statement,5,sqlS4.c_str(),sqlS4.size(),SQLITE_TRANSIENT); 
       sqlite3_bind_int(statement,6,sqlI2); 
       sqlite3_bind_int(statement,7,sqlI3); 
       sqlite3_bind_double(statement,8,sqlF1); 
       sqlite3_bind_double(statement,9,sqlF2); 
       sqlite3_bind_int64(statement,10,sqlLLI1); 
       sqlite3_bind_int64(statement,11,sqlLLI2); 

       sqlite3_step(statement); 

       cout << "."; 
      } 
     } 
    }  

    else 
    { 
     *bErrors = true; 
     createBInfo();  
     d.createBReport("SQL Code 2",sqlite3_errmsg(dBase),bLocale + to_string(__LINE__),bTDate,"./SC_Log.txt");  
    } 

    sqlite3_exec(dBase, "END TRANSACTION", NULL, NULL, &error); 

    sFlags_Temp.push_back(saveFlag()); 
    sFlags_Temp.at(sFlags_Temp.size()-1).sfName = "GPlanets"; 
    sFlags_Temp.at(sFlags_Temp.size()-1).sfValue = 1; 
    cout << "Done" << endl << endl; 
} 

답변

1

당신이 sqlite3_stepsqlite3_reset에 대한 호출이없는 것 같습니다 다음 매개 변수 세트를 Y 인드하기 전에. 그리고 당신은 그것에 대해 당신에게 말했을 반환 코드를 무시하고 있습니다.

여기에 sqlite3_step에 대한 설명서보기 : http://sqlite.org/c3ref/step.html

관련 문제