오 자세한 설명 감사드려요 덕분에 알것같네요
감사합니다.
조대현.Clau 님이 쓰신 글 :
: 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여기서 에러가나는데요 이유를 모르겠네여
: :
: : 이것저것 해봐도 모르겠어요.