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
[66871] Re:Re:ADO INSERT
축구 [] 1297 읽음    2012-04-10 09:17
오 자세한 설명 감사드려요 덕분에 알것같네요

감사합니다.


조대현.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여기서 에러가나는데요 이유를 모르겠네여
: :
: : 이것저것 해봐도 모르겠어요.

+ -

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