Q&A

  • 데이터를 Insert하는데 무결성 에러가 발생합니다.
음..어떤데이터를 하나씩 insert하려고 하는데..무결성 에러가 발생합니다.
일단 소스부터 올리겠습니다.

************

procedure TForm1.Button1Click(Sender: TObject);
var stype, scharge, sbsnum, sbsname, sbstype, sbskind, smoney, svat, spayid, sseq : string;
   iseq, imoney, ivat : integer;

begin
  iseq := table1.RecordCount + 1;

  scharge := edit2.Text;
  sbsnum := edit3.Text;
  sbsname := edit4.Text;
  sbstype := edit5.Text;
  sbskind := edit6.Text;
  smoney := edit7.Text;
  svat := edit8.Text;
  spayid := edit9.Text;
  sseq := inttostr(iseq);

  imoney := strtoint(smoney);
  ivat := strtoint(svat);

  if combobox1.Text = '1.매출' then
     stype := '1'
  else
     stype := '2';
  query1.Active := true;
  query1.sql.Clear;
  Query1.SQL.text := ' insert into budget '
                   + ' values (''' + stype + ''',''' + scharge + ''',' + sseq + ', ''' + sbsnum
                   + ''', ''' + sbsname + ''', ''' + sbstype + ''', ''' + sbskind + ''','
                   + smoney + ',' + svat + ',''' + spayid + ''')';



  Query1.ExecSQL;

  table1.Refresh;

end;

************************************

지금 코딩을 하는 과정이라 정리가 안되서, 쓸모없는 변수도 많이 들어가 있구 보기가 좀 지저분 할지도 모르겠습니다..^^;;
근데...윗부분에서 테이블 내에 하나의 필드(seq)를 주어 레코드의 번호를 주려고 했는데...자꾸 무결성에러가 뜨네요..처음 데이터는 입력이 되고 바로 이어서 다른데이터를 입력하면 에러가 뜹니다.폼을 아예 닫았다가 하면 또 입력이 되네요..처음것만...ㅡ.ㅡ;

즉 정리하자면 폼을 열고 첫 데이터는 입력이 되고 그담에는 무결성에 걸리는거 같습니다.

Database는 오라9i 이고, seq필드는 프라이머리키 입니다....

조언좀 부탁드리겠습니다...도저히 잘 모르겠네요..ㅜ.ㅜ
3  COMMENTS
  • Profile
    프리빌 2002.10.22 08:01

    ====================================

    오라클이라면 트랜젝션 처리는 하셨는지요.

    with DataBase,Query do begin
      try
         StartTransaction;
         Sql.Clear;
         Sql.Add(..........);
         ExecSQL;
         Commit
      except
        RollBack;
      end;
    end;

    이런 식으로요.
  • Profile
    머슴 2002.10.22 04:42
      도움이 될란지 모르지만..

        iseq := table1.RecordCount + 1;


      이부분이 의심스럽습니다.. 혹시 Table컴퍼넌트에 필터조건으로

      조회를 하게되면... RecordCount의 수가 seq의 맨마지막

      번호가 아닙니다. 또 중간의 자료가 삭제가 되면 맨마지막

      번호가 아닙니다.

      따라서 아래와 같은 식으로 seq값 가지고 오셔야 합니다..
      
        select max(seq)+1   from budget
        where 조건이 필요하면 조건을 입력;

      이거나    역인덱스이용(튜닝을 생각한다면)를 이용하셔서

      다음 번호를 가지고 오셔야 합니다..

      이방법이 안 쓰실것이면 오라클에서 시퀀스를 생성하여 자동

      번호를 부여하는 방법이 있습니다..

      제 생각에는 iseq := table1.RecordCount + 1;

    이부분의 코드를 바꾸셔야 할것 같습니다... 가장 걱정되는 부분은

    자료삭제가 될때.. 마지막번호+1한 값이 전체 레코드수하고 일치

    하지 않는다는 점이 가장 걱정이 되는 군요..
  • Profile
    타락천사 2002.10.22 03:13
    안녕하세여. 타락임다.


    이렇게 해야 되지 않나여.

    즐푸하세여.

    타락천사..