1. INSERT 할때 varchar등의 문자열은 작은따옴표로 감싸야합니다.
executesql에서 에러나는 이유는 이 문제입니다.
(수정전)
: TempText.sprintf( "INSERT INTO testinfo(edit1, edit2, edit3)"
: "VALUES(%s, %s, %s)",
: Edit1->Text,
: Edit2->Text,
: Edit3->Text );
(수정후)
: TempText.sprintf( "INSERT INTO testinfo(edit1, edit2, edit3)"
: "VALUES('%s', '%s', '%s')",
: Edit1->Text,
: Edit2->Text,
: Edit3->Text );
2. 그리고 가장 중요한것은 ExecuteSQL함수에서 에러가 나면 어떤 원인인지 알면 금방 잡을 수 있습니다.
try{
ADOQuery1->ExecSQL();
}catch(const Exception &E) {
Memo1->Lines->Add(E.Message);
}
이렇게 catch에서 Exception을 잡아내시면
어떤 메세지든지 IDE상에서 보는 메세지가 나옵니다.
sql에서 뭐가 문제인지도 나옵니다.
무조건 하시면 좋습니다.
3. for문돌때 SQL에 Add만 하고 Clear를 안하면 쿼리가 계속 쌓입니다.
(수정전)
: for(int i = 0; i < Temp.RefCount()+1; i++)
: {
: if(ADOQuery1->Fields->Fields[i]->AsString != AnsiString(Edit1->Text))
: {
: ADOQuery1->Insert();
: ADOQuery1->SQL->Add(TempText);
: ADOQuery1->ExecSQL();
: ADOConnection1->CommitTrans();
: Memo1->Lines->Add("삽입성공");
: }else{
: Memo1->Lines->Add("삽입실패");
: }
(수정후)
: for(int i = 0; i < Temp.RefCount()+1; i++)
: {
: if(ADOQuery1->Fields->Fields[i]->AsString != AnsiString(Edit1->Text))
: {
: ADOQuery1->Insert();
: ADOQuery1->SQL->Clear();
: ADOQuery1->SQL->Add(TempText);
: ADOQuery1->ExecSQL();
: ADOConnection1->CommitTrans();
: Memo1->Lines->Add("삽입성공");
: }else{
: Memo1->Lines->Add("삽입실패");
: }
4. ADOConnection의 접속은 둘중 하나만 하시면 됩니다.
: ADOConnection1->Connected = true;
: //ADOConnection1->Open();
5. ADOQuery에서 데이터 읽을때는 Active와 RecordCount를 꼭 확인하세요.
if (ADOQuery1->Active == true)
if (ADOQuery1->RecordCount > 0)
AnsiString Temp = ADOQuery1->FieldByName("edit1")->AsString;
이것도 catch로 잡아내면 뭐땜에 안되는지 다 나옵니다.
6. 그리고 빌더버전이 2006이상이면 AnsiString에 sprintf할때 %s에 해당하는 문자열 포인터는 w_chart*로 오면 안됩니다.
아래처럼 ansistring으로 캐스팅 후 c_str로 포인터를 지정하세요.
안그러면 unicodestring이라 한글자밖에 안넘어갑니다.
TempText.sprintf( "INSERT INTO testinfo(edit1, edit2, edit3)"
" VALUES (''%s'', ''%s'', ''%s'')",
((AnsiString)Edit1->Text).c_str(),
((AnsiString)Edit1->Text).c_str(),
((AnsiString)Edit1->Text).c_str());
7. Commit을 for문안에 넣으시면 다음 쿼리는 커밋이 안됩니다^^
: for(int i = 0; i < Temp.RefCount()+1; i++)
: {
: if(ADOQuery1->Fields->Fields[i]->AsString != AnsiString(Edit1->Text))
: {
: ADOQuery1->Insert();
: ADOQuery1->SQL->Add(TempText);
: ADOQuery1->ExecSQL();
: //ADOConnection1->CommitTrans();
: Memo1->Lines->Add("삽입성공");
: }else{
: Memo1->Lines->Add("삽입실패");
: }
: ADOConnection1->CommitTrans();
축구 님이 쓰신 글 :
:
: void __fastcall TForm1::FormCreate(TObject *Sender)
: {
: try {
: ADOConnection1->Connected = true;
: ADOConnection1->Open();
: Memo1->Lines->Add("DB에 연결되었습니다.");
: String sql = "select * from testinfo";
:
: try{
: ADOQuery1->SQL->Text = sql;
: ADOQuery1->Open();
: } catch (...) {
: Memo1->Lines->Add("쿼리 실패");
: }
: } catch (...) {
: Memo1->Lines->Add("연결 실패");
: }
: }
: //---------------------------------------------------------------------------
: void __fastcall TForm1::Button1Click(TObject *Sender)
: {
: AnsiString TempText;
: TempText.sprintf( "INSERT INTO testinfo(edit1, edit2, edit3)"
: "VALUES(%s, %s, %s)",
: Edit1->Text,
: Edit2->Text,
: Edit3->Text );
:
: AnsiString Temp = ADOQuery1->FieldByName("edit1")->AsString;
:
: if(!ADOConnection1->InTransaction)
: {
: ADOConnection1->BeginTrans();
: }else{
: ADOConnection1->CommitTrans();
: }
: try{
: for(int i = 0; i < Temp.RefCount()+1; i++)
: {
: if(ADOQuery1->Fields->Fields[i]->AsString != AnsiString(Edit1->Text))
: {
: ADOQuery1->Insert();
: ADOQuery1->SQL->Add(TempText);
: ADOQuery1->ExecSQL();
: ADOConnection1->CommitTrans();
: Memo1->Lines->Add("삽입성공");
: }else{
: Memo1->Lines->Add("삽입실패");
: }
: }
: }catch(...){
: ADOConnection1->RollbackTrans();
: }
: }
:
:
: 이걸 실행시키면 ExecSQL여기서 에러가나는데요 이유를 모르겠네여
:
: 이것저것 해봐도 모르겠어요.