C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 Q&A
C++Builder Programming Q&A
[66865] Re:ADO INSERT
조대현.Clau [casanebula] 1184 읽음    2012-04-09 23:13
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여기서 에러가나는데요 이유를 모르겠네여
:
: 이것저것 해봐도 모르겠어요.

+ -

관련 글 리스트
66863 ADO INSERT 축구 883 2012/04/09
66865     Re:ADO INSERT 조대현.Clau 1184 2012/04/09
66871         Re:Re:ADO INSERT 축구 1298 2012/04/10
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.