Q&A

  • 오라클 insert 좀 가르쳐주세요.
오라클 7.3을 쓰고요, 델파이 4를 씁니다.

전에는 파라독스를 써왔는데, 오라클로 바꿨습니다.

폼은 MDI형식을 사용합니다.



오라클 설정도 잘 됐고, 잘 돌아가는데 문제는 12개 칼럼까지 데이터가

입력되지 않습니다. 파라독스때는 stringlist를 써서 해결을 봤는데

오라클은 왜 안되는 지 알 수가 없습니다.

12개 이상 데이터를 입력해야하는데 걱정입니다.

폼은 MDI형식을 사용합니다. db관련 컴포넌트는 Seletion이라는 MDIChid에 있고

sql 구문은 RP200001이라는 MDIChid에 있습니다.

다음은 제가 사용한 insert 문장입니다.

보시고 어떻게 해야 하는지 부탁합니다.



var

StringList: TStrings;

i : integer;

begin

StringList := TStringList.Create;

try

with StringList do

begin

Add('insert into 고추'+Selection.edit2.text+Selection.edit3.text+' ');

Add('(ID,이름,지역번호,전화번호,도,시,군,응답1차,');

Add('작년총재배면적,금년총재배면적,작년멀칭재배면적,금년멀칭재배면적,');

Add('작년터널재배면적,금년터널재배면적,작년하우스재배면적,작년하우스재배면적,');

Add('현재건고추보유량,작년건고추보유량) ');

Add('values ');

Add('(:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10,:p11,:p12,');

Add(':p13:p14,:p15,:p16,:p17,:p18) ');

end;



with Selection.query2 do

begin

close;

sql.clear;

sql:=StringList;

parambyname('p1').asstring := edit1.text+edit2.text+edit3.text+edit4.text;

parambyname('p2').asstring := edit5.text;

parambyname('p3').asstring := edit6.text;

parambyname('p4').asstring := edit7.text;

parambyname('p5').asstring := edit8.text;

parambyname('p6').asstring := edit9.text;

parambyname('p7').asstring := edit10.text;

parambyname('p8').asstring := edit11.text;

parambyname('p9').asinteger := StrToInt(edit12.text);

parambyname('p10').asinteger := StrToInt(edit13.text);

parambyname('p11').asinteger := StrToInt(edit14.text);

parambyname('p12').asinteger := StrToInt(edit15.text);

parambyname('p13').asinteger := StrToInt(edit16.text);

parambyname('p14').asinteger := StrToInt(edit17.text);

parambyname('p15').asinteger := StrToInt(edit18.text);

parambyname('p16').asinteger := StrToInt(edit19.text);

parambyname('p17').asinteger := StrToInt(edit20.text);

parambyname('p18').asinteger := StrToInt(edit21.text);

execsql;

end;

finally

stringlist.free;

end;





3  COMMENTS
  • Profile
    smileye 2000.02.21 09:47
    한근수 wrote:

    > 오라클 7.3을 쓰고요, 델파이 4를 씁니다.

    > 전에는 파라독스를 써왔는데, 오라클로 바꿨습니다.

    > 폼은 MDI형식을 사용합니다.

    >

    > 오라클 설정도 잘 됐고, 잘 돌아가는데 문제는 12개 칼럼까지 데이터가

    > 입력되지 않습니다. 파라독스때는 stringlist를 써서 해결을 봤는데

    > 오라클은 왜 안되는 지 알 수가 없습니다.

    > 12개 이상 데이터를 입력해야하는데 걱정입니다.

    > 폼은 MDI형식을 사용합니다. db관련 컴포넌트는 Seletion이라는 MDIChid에 있고

    > sql 구문은 RP200001이라는 MDIChid에 있습니다.

    > 다음은 제가 사용한 insert 문장입니다.

    > 보시고 어떻게 해야 하는지 부탁합니다.

    >



    > var

    > StringList: TStrings;

    > i : integer;

    > begin

    > StringList := TStringList.Create;

    > try

    > with StringList do

    > begin

    > Add('insert into 고추'+Selection.edit2.text+Selection.edit3.text+' ');

    > Add('(ID,이름,지역번호,전화번호,도,시,군,응답1차,');

    > Add('작년총재배면적,금년총재배면적,작년멀칭재배면적,금년멀칭재배면적,');

    > Add('작년터널재배면적,금년터널재배면적,작년하우스재배면적,작년하우스재배면적,');

    > Add('현재건고추보유량,작년건고추보유량) ');

    > Add('values ');

    > Add('(:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10,:p11,:p12,');

    > Add(':p13:p14,:p15,:p16,:p17,:p18) ');

    > end;

    >

    > with Selection.query2 do

    > begin

    > close;

    > sql.clear;

    > sql:=StringList;

    > parambyname('p1').asstring := edit1.text+edit2.text+edit3.text+edit4.text;

    > parambyname('p2').asstring := edit5.text;

    > parambyname('p3').asstring := edit6.text;

    > parambyname('p4').asstring := edit7.text;

    > parambyname('p5').asstring := edit8.text;

    > parambyname('p6').asstring := edit9.text;

    > parambyname('p7').asstring := edit10.text;

    > parambyname('p8').asstring := edit11.text;

    > parambyname('p9').asinteger := StrToInt(edit12.text);

    > parambyname('p10').asinteger := StrToInt(edit13.text);

    > parambyname('p11').asinteger := StrToInt(edit14.text);

    > parambyname('p12').asinteger := StrToInt(edit15.text);

    > parambyname('p13').asinteger := StrToInt(edit16.text);

    > parambyname('p14').asinteger := StrToInt(edit17.text);

    > parambyname('p15').asinteger := StrToInt(edit18.text);

    > parambyname('p16').asinteger := StrToInt(edit19.text);

    > parambyname('p17').asinteger := StrToInt(edit20.text);

    > parambyname('p18').asinteger := StrToInt(edit21.text);

    > execsql;

    > end;

    > finally

    > stringlist.free;

    > end;

    >

    >



    잘은 모르지만,

    한가지 귀뜸을 하자면,

    에러메세지가 sql문의 잘못으로 나는 것이라면

    예로, 열명에러, 위 같은 에러등은

    델파이에 있는 sqlmon.exe를 실행후 그곳에 기록되는 내용을 복사하여

    plus32.exe 또는 plus33w.exe를 실행하면

    친절하게 잘못된 부분을 집어 줍니다.

    눈을 부릅뜨고, 소스를 검사하는 고통을 덜어줍니다.



    처음에는 저도 소스르 하나하나 검사 하다보면 왕짜증이 나는데

    위방을 사용하면 편리합니다.



    그리고, 아래 답변들중에 입력후 다시 검사하기 위하여 select를 하는데,

    TQuery.rowsaffected 를 검사하면 됩니다.



    반영된 갯수를 돌려줍니다.



    query1.execsql;

    showmessage(format('%d 개의 행이 추가되었습니다',[query1.rowsaffected]));



    도움이 되셨는지...



  • Profile
    윤병익 2000.02.16 18:55
    맞는지 모르겠네요....

    전 이런 방법으로 Insert를 하고 있습니다...

    참고로 제가 알기로는 Select문 빼고는 (Insert,Delete,Update...)

    TQuery를 Close하지 않아도 되는것으로 알고 있습니다...(월래 않하는 건가???)

    암튼 지금 생각 나는대로 적어 봅니다....

    혹시라도 않되면.. 연락 주세요....



    {그냥 무식하게 하는 쿼리..... (참고로 별로 좋지 않은 방법 같습니다... 그래도 되긴

    되긴 됩니다... 첨에 제가 이방을 사용했어요...)



    with Query1 do

    begin

    SQL.Add('Insert into TestTable Values('+Edit1.Text+','''+Edit2.Text+'''');

    ExecSQL;

    // 여기까지만 하면 Insert는 되는데 Insert가 된것을 확인할수 없죠... 그래서 Select를 한다.

    Close;

    SQL.Clear;

    SQL.Add('Select * From TestTable');

    SQL.Open;

    // 이렇게 하면 Insert하고 다시 모든것을 보여주니까.. Insert한것까지 보여준다...

    end;





    {이것이 위에꺼보다 좋은것 같아요... 파리미터 쿼리라고 하는군요.... (맞나?)}

    with Query1 do

    begin

    SQL.Add('Insert into TestTable Values(:Test1,:Test2);

    ParambyName('Test1').AsInteger:=StrToInt(Edit1.Text);

    ParambyName('Test2').AsString:=Edit2.Text;

    ExecSQL;

    // Insert하고...

    Close;

    SQL.Clear;

    SQL.Add('Select * From TestTable');

    SQL.Open;

    // 다시 보여주고....

    end;





    한근수 wrote:

    > 오라클 7.3을 쓰고요, 델파이 4를 씁니다.

    > 전에는 파라독스를 써왔는데, 오라클로 바꿨습니다.

    > 폼은 MDI형식을 사용합니다.

    >

    > 오라클 설정도 잘 됐고, 잘 돌아가는데 문제는 12개 칼럼까지 데이터가

    > 입력되지 않습니다. 파라독스때는 stringlist를 써서 해결을 봤는데

    > 오라클은 왜 안되는 지 알 수가 없습니다.

    > 12개 이상 데이터를 입력해야하는데 걱정입니다.

    > 폼은 MDI형식을 사용합니다. db관련 컴포넌트는 Seletion이라는 MDIChid에 있고

    > sql 구문은 RP200001이라는 MDIChid에 있습니다.

    > 다음은 제가 사용한 insert 문장입니다.

    > 보시고 어떻게 해야 하는지 부탁합니다.

    >

    > var

    > StringList: TStrings;

    > i : integer;

    > begin

    > StringList := TStringList.Create;

    > try

    > with StringList do

    > begin

    > Add('insert into 고추'+Selection.edit2.text+Selection.edit3.text+' ');

    > Add('(ID,이름,지역번호,전화번호,도,시,군,응답1차,');

    > Add('작년총재배면적,금년총재배면적,작년멀칭재배면적,금년멀칭재배면적,');

    > Add('작년터널재배면적,금년터널재배면적,작년하우스재배면적,작년하우스재배면적,');

    > Add('현재건고추보유량,작년건고추보유량) ');

    > Add('values ');

    > Add('(:p1,:p2,:p3,:p4,:p5,:p6,:p7,:p8,:p9,:p10,:p11,:p12,');

    > Add(':p13:p14,:p15,:p16,:p17,:p18) ');

    > end;

    >

    > with Selection.query2 do

    > begin

    > close;

    > sql.clear;

    > sql:=StringList;

    > parambyname('p1').asstring := edit1.text+edit2.text+edit3.text+edit4.text;

    > parambyname('p2').asstring := edit5.text;

    > parambyname('p3').asstring := edit6.text;

    > parambyname('p4').asstring := edit7.text;

    > parambyname('p5').asstring := edit8.text;

    > parambyname('p6').asstring := edit9.text;

    > parambyname('p7').asstring := edit10.text;

    > parambyname('p8').asstring := edit11.text;

    > parambyname('p9').asinteger := StrToInt(edit12.text);

    > parambyname('p10').asinteger := StrToInt(edit13.text);

    > parambyname('p11').asinteger := StrToInt(edit14.text);

    > parambyname('p12').asinteger := StrToInt(edit15.text);

    > parambyname('p13').asinteger := StrToInt(edit16.text);

    > parambyname('p14').asinteger := StrToInt(edit17.text);

    > parambyname('p15').asinteger := StrToInt(edit18.text);

    > parambyname('p16').asinteger := StrToInt(edit19.text);

    > parambyname('p17').asinteger := StrToInt(edit20.text);

    > parambyname('p18').asinteger := StrToInt(edit21.text);

    > execsql;

    > end;

    > finally

    > stringlist.free;

    > end;

    >

  • Profile
    신숙정 2000.02.16 18:28
    올리신 소스가 실제 프로그램 소스와 동일하다면 오타가 난 게 아닐까 생각합니다.



    아래중에 :p13 다음에 ','를 빼먹은 게 안닌지요.



    > Add(':p13:p14,:p15,:p16,:p17,:p18) ');





    만약 실제로는 ','를 찍으셨다면

    왜 안되는지는 저도 궁금하군요.