Q&A

  • Text파일(콤마를 구분자로 하는)을 읽어 DB에 저장 시 BDE 에러가 납니다.
제가 텍스트화일을 읽어와서 콤마를 구분자로하여 db에 저장하는 것을 하려고하느데요

자꾸 bde에러가 나네여...누가좀 어디가 어떻게 잘못됐는지좀 알려주세요.



unit Unit1;



interface



uses

Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

Menus, StdCtrls, ActnList, Db, DBTables, Grids, DBGrids;



type

TForm1 = class(TForm)

MainMenu1: TMainMenu;

f1: TMenuItem;

o1: TMenuItem;

x1: TMenuItem;

OD: TOpenDialog;

ActionList1: TActionList;

Open: TAction;

exit: TAction;

SD: TSaveDialog;

DBGrid1: TDBGrid;

DataSource1: TDataSource;

Query1: TQuery;

procedure OpenExecute(Sender: TObject);

procedure exitExecute(Sender: TObject);

private

{ Private declarations }

public

{ Public declarations }

end;



var

Form1: TForm1;



implementation



{$R *.DFM}



procedure TForm1.OpenExecute(Sender: TObject);

Var

I,K,Cnt,R_SEQ : Integer;

Num, kNo, kMemo, Name, Dept, Day : string;

FP : Textfile;

Buf : String;

begin

Cnt := 0;

if OD.Execute then

begin

AssignFile(FP,OD.FileName);

Reset(FP);

While not Eof(FP) do

Begin

Num :=''; kNo :=''; Buf :=''; kMemo :='';Name:='';

Dept :=''; Day :='';

Readln(FP,Buf);

K:=0;

for I:=1 to Length(buf) do

begin

if buf[I] = ',' then

K := K + 1

else

case K of

0 : Num := Num + Buf[i];

1 : kNo := kNo + Buf[i];

2 : kMemo := kMemo + buf[i];

3 : Name := Name + buf[i];

4 : Dept := Dept + buf[i];

5 : Day := Day + buf[i];

end;

kNo := Trim(kNo);

kMemo := Trim(kMemo);

Name := Trim(Name);

Dept := Trim(Dept);

Day := Trim(Day);

with Query1 do

begin

SQL.Clear;

SQL.Add('insert into test');

SQL.Add('values(:r1,:r2,:r3,:r4,:r5)');

{ SQL.Add('update test');

SQL.Add('Number =:r1,');

SQL.Add('kMemo =:r2,');

SQL.Add('Name =:r3,');

SQL.Add('Dept =:r4,');

SQL.Add('Day =:r5,');}

Query1.ParambyName('r1').AsString := kNo;

Query1.ParambyName('r2').AsString := kMemo;

Query1.ParambyName('r3').AsString := Name;

Query1.ParambyName('r4').AsString := Dept;

Query1.ParambyName('r5').AsString := Day;

ExecSQL;

end;

end;

end;

end;

end;



procedure TForm1.exitExecute(Sender: TObject);

begin

close;

end;



end.

3  COMMENTS
  • Profile
    김재억 2000.11.12 22:40
    Query가 두개이군요.



    먼저 Insert문이 있구 다음에 Update를 넣은 다음 Query를 실행시켰군요.

    그렇게 하지시 말구...



    Sql.Clear;

    Insert문 삽입

    파라미터 대입

    Query 실행

    Sql.Clear;

    Update문 삽입

    파라미터 대입

    Query 실행



    이렇게 하시면 됩니다.



    정 이 방법이 싫으시다면 두개의 Query컴포넌트를 사용해서 연속적으로 실행시키거나, 아니면 Stored Procedure를 사용하세요.

    제 개인적으로는 Stored Procedure를 추천합니다.





    ????????? wrote:

    > 제가 텍스트화일을 읽어와서 콤마를 구분자로하여 db에 저장하는 것을 하려고하느데요

    > 자꾸 bde에러가 나네여...누가좀 어디가 어떻게 잘못됐는지좀 알려주세요.

    >

    > unit Unit1;

    >

    > interface

    >

    > uses

    > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > Menus, StdCtrls, ActnList, Db, DBTables, Grids, DBGrids;

    >

    > type

    > TForm1 = class(TForm)

    > MainMenu1: TMainMenu;

    > f1: TMenuItem;

    > o1: TMenuItem;

    > x1: TMenuItem;

    > OD: TOpenDialog;

    > ActionList1: TActionList;

    > Open: TAction;

    > exit: TAction;

    > SD: TSaveDialog;

    > DBGrid1: TDBGrid;

    > DataSource1: TDataSource;

    > Query1: TQuery;

    > procedure OpenExecute(Sender: TObject);

    > procedure exitExecute(Sender: TObject);

    > private

    > { Private declarations }

    > public

    > { Public declarations }

    > end;

    >

    > var

    > Form1: TForm1;

    >

    > implementation

    >

    > {$R *.DFM}

    >

    > procedure TForm1.OpenExecute(Sender: TObject);

    > Var

    > I,K,Cnt,R_SEQ : Integer;

    > Num, kNo, kMemo, Name, Dept, Day : string;

    > FP : Textfile;

    > Buf : String;

    > begin

    > Cnt := 0;

    > if OD.Execute then

    > begin

    > AssignFile(FP,OD.FileName);

    > Reset(FP);

    > While not Eof(FP) do

    > Begin

    > Num :=''; kNo :=''; Buf :=''; kMemo :='';Name:='';

    > Dept :=''; Day :='';

    > Readln(FP,Buf);

    > K:=0;

    > for I:=1 to Length(buf) do

    > begin

    > if buf[I] = ',' then

    > K := K + 1

    > else

    > case K of

    > 0 : Num := Num + Buf[i];

    > 1 : kNo := kNo + Buf[i];

    > 2 : kMemo := kMemo + buf[i];

    > 3 : Name := Name + buf[i];

    > 4 : Dept := Dept + buf[i];

    > 5 : Day := Day + buf[i];

    > end;

    > kNo := Trim(kNo);

    > kMemo := Trim(kMemo);

    > Name := Trim(Name);

    > Dept := Trim(Dept);

    > Day := Trim(Day);

    > with Query1 do

    > begin

    > SQL.Clear;

    > SQL.Add('insert into test');

    > SQL.Add('values(:r1,:r2,:r3,:r4,:r5)');

    > { SQL.Add('update test');

    > SQL.Add('Number =:r1,');

    > SQL.Add('kMemo =:r2,');

    > SQL.Add('Name =:r3,');

    > SQL.Add('Dept =:r4,');

    > SQL.Add('Day =:r5,');}

    > Query1.ParambyName('r1').AsString := kNo;

    > Query1.ParambyName('r2').AsString := kMemo;

    > Query1.ParambyName('r3').AsString := Name;

    > Query1.ParambyName('r4').AsString := Dept;

    > Query1.ParambyName('r5').AsString := Day;

    > ExecSQL;

    > end;

    > end;

    > end;

    > end;

    > end;

    >

    > procedure TForm1.exitExecute(Sender: TObject);

    > begin

    > close;

    > end;

    >

    > end.

  • Profile
    ????????? 2000.11.13 10:29
    제가 시키신 방법중에 젤루 위에것처럼 sql문을 두개로 나누어 써봤거든여...글구 안돼서 update문을 지워버렸는데도 안돼네요... 죄송한데여...다시한번만 조언 부탁드립니다...참고로 에러는여...key violation 이라는 에러네요...그럼...^^





    김재억 wrote:

    > Query가 두개이군요.

    >

    > 먼저 Insert문이 있구 다음에 Update를 넣은 다음 Query를 실행시켰군요.

    > 그렇게 하지시 말구...

    >

    > Sql.Clear;

    > Insert문 삽입

    > 파라미터 대입

    > Query 실행

    > Sql.Clear;

    > Update문 삽입

    > 파라미터 대입

    > Query 실행

    >

    > 이렇게 하시면 됩니다.

    >

    > 정 이 방법이 싫으시다면 두개의 Query컴포넌트를 사용해서 연속적으로 실행시키거나, 아니면 Stored Procedure를 사용하세요.

    > 제 개인적으로는 Stored Procedure를 추천합니다.

    >

    >

    > ????????? wrote:

    > > 제가 텍스트화일을 읽어와서 콤마를 구분자로하여 db에 저장하는 것을 하려고하느데요

    > > 자꾸 bde에러가 나네여...누가좀 어디가 어떻게 잘못됐는지좀 알려주세요.

    > >

    > > unit Unit1;

    > >

    > > interface

    > >

    > > uses

    > > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > > Menus, StdCtrls, ActnList, Db, DBTables, Grids, DBGrids;

    > >

    > > type

    > > TForm1 = class(TForm)

    > > MainMenu1: TMainMenu;

    > > f1: TMenuItem;

    > > o1: TMenuItem;

    > > x1: TMenuItem;

    > > OD: TOpenDialog;

    > > ActionList1: TActionList;

    > > Open: TAction;

    > > exit: TAction;

    > > SD: TSaveDialog;

    > > DBGrid1: TDBGrid;

    > > DataSource1: TDataSource;

    > > Query1: TQuery;

    > > procedure OpenExecute(Sender: TObject);

    > > procedure exitExecute(Sender: TObject);

    > > private

    > > { Private declarations }

    > > public

    > > { Public declarations }

    > > end;

    > >

    > > var

    > > Form1: TForm1;

    > >

    > > implementation

    > >

    > > {$R *.DFM}

    > >

    > > procedure TForm1.OpenExecute(Sender: TObject);

    > > Var

    > > I,K,Cnt,R_SEQ : Integer;

    > > Num, kNo, kMemo, Name, Dept, Day : string;

    > > FP : Textfile;

    > > Buf : String;

    > > begin

    > > Cnt := 0;

    > > if OD.Execute then

    > > begin

    > > AssignFile(FP,OD.FileName);

    > > Reset(FP);

    > > While not Eof(FP) do

    > > Begin

    > > Num :=''; kNo :=''; Buf :=''; kMemo :='';Name:='';

    > > Dept :=''; Day :='';

    > > Readln(FP,Buf);

    > > K:=0;

    > > for I:=1 to Length(buf) do

    > > begin

    > > if buf[I] = ',' then

    > > K := K + 1

    > > else

    > > case K of

    > > 0 : Num := Num + Buf[i];

    > > 1 : kNo := kNo + Buf[i];

    > > 2 : kMemo := kMemo + buf[i];

    > > 3 : Name := Name + buf[i];

    > > 4 : Dept := Dept + buf[i];

    > > 5 : Day := Day + buf[i];

    > > end;

    > > kNo := Trim(kNo);

    > > kMemo := Trim(kMemo);

    > > Name := Trim(Name);

    > > Dept := Trim(Dept);

    > > Day := Trim(Day);

    > > with Query1 do

    > > begin

    > > SQL.Clear;

    > > SQL.Add('insert into test');

    > > SQL.Add('values(:r1,:r2,:r3,:r4,:r5)');

    > > { SQL.Add('update test');

    > > SQL.Add('Number =:r1,');

    > > SQL.Add('kMemo =:r2,');

    > > SQL.Add('Name =:r3,');

    > > SQL.Add('Dept =:r4,');

    > > SQL.Add('Day =:r5,');}

    > > Query1.ParambyName('r1').AsString := kNo;

    > > Query1.ParambyName('r2').AsString := kMemo;

    > > Query1.ParambyName('r3').AsString := Name;

    > > Query1.ParambyName('r4').AsString := Dept;

    > > Query1.ParambyName('r5').AsString := Day;

    > > ExecSQL;

    > > end;

    > > end;

    > > end;

    > > end;

    > > end;

    > >

    > > procedure TForm1.exitExecute(Sender: TObject);

    > > begin

    > > close;

    > > end;

    > >

    > > end.

  • Profile
    linuxwiz 2000.11.14 02:34
    key violation 이라는 에러



    db에 넣는 텍스트 파일의 데이타가 중복되어서 그런겁니다..

    키중복을 찾는 select문을 하나더 넣어보심이 좋을 것 같네여...





    그리구..



    쿼리중에서..



    close;

    문이 빠졌네여...



    디비를 닫은상태에서 하셔야 합니다...





    ????????? wrote:

    > 제가 시키신 방법중에 젤루 위에것처럼 sql문을 두개로 나누어 써봤거든여...글구 안돼서 update문을 지워버렸는데도 안돼네요... 죄송한데여...다시한번만 조언 부탁드립니다...참고로 에러는여...key violation 이라는 에러네요...그럼...^^

    >

    >

    > 김재억 wrote:

    > > Query가 두개이군요.

    > >

    > > 먼저 Insert문이 있구 다음에 Update를 넣은 다음 Query를 실행시켰군요.

    > > 그렇게 하지시 말구...

    > >

    > > Sql.Clear;

    > > Insert문 삽입

    > > 파라미터 대입

    > > Query 실행

    > > Sql.Clear;

    > > Update문 삽입

    > > 파라미터 대입

    > > Query 실행

    > >

    > > 이렇게 하시면 됩니다.

    > >

    > > 정 이 방법이 싫으시다면 두개의 Query컴포넌트를 사용해서 연속적으로 실행시키거나, 아니면 Stored Procedure를 사용하세요.

    > > 제 개인적으로는 Stored Procedure를 추천합니다.

    > >

    > >

    > > ????????? wrote:

    > > > 제가 텍스트화일을 읽어와서 콤마를 구분자로하여 db에 저장하는 것을 하려고하느데요

    > > > 자꾸 bde에러가 나네여...누가좀 어디가 어떻게 잘못됐는지좀 알려주세요.

    > > >

    > > > unit Unit1;

    > > >

    > > > interface

    > > >

    > > > uses

    > > > Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,

    > > > Menus, StdCtrls, ActnList, Db, DBTables, Grids, DBGrids;

    > > >

    > > > type

    > > > TForm1 = class(TForm)

    > > > MainMenu1: TMainMenu;

    > > > f1: TMenuItem;

    > > > o1: TMenuItem;

    > > > x1: TMenuItem;

    > > > OD: TOpenDialog;

    > > > ActionList1: TActionList;

    > > > Open: TAction;

    > > > exit: TAction;

    > > > SD: TSaveDialog;

    > > > DBGrid1: TDBGrid;

    > > > DataSource1: TDataSource;

    > > > Query1: TQuery;

    > > > procedure OpenExecute(Sender: TObject);

    > > > procedure exitExecute(Sender: TObject);

    > > > private

    > > > { Private declarations }

    > > > public

    > > > { Public declarations }

    > > > end;

    > > >

    > > > var

    > > > Form1: TForm1;

    > > >

    > > > implementation

    > > >

    > > > {$R *.DFM}

    > > >

    > > > procedure TForm1.OpenExecute(Sender: TObject);

    > > > Var

    > > > I,K,Cnt,R_SEQ : Integer;

    > > > Num, kNo, kMemo, Name, Dept, Day : string;

    > > > FP : Textfile;

    > > > Buf : String;

    > > > begin

    > > > Cnt := 0;

    > > > if OD.Execute then

    > > > begin

    > > > AssignFile(FP,OD.FileName);

    > > > Reset(FP);

    > > > While not Eof(FP) do

    > > > Begin

    > > > Num :=''; kNo :=''; Buf :=''; kMemo :='';Name:='';

    > > > Dept :=''; Day :='';

    > > > Readln(FP,Buf);

    > > > K:=0;

    > > > for I:=1 to Length(buf) do

    > > > begin

    > > > if buf[I] = ',' then

    > > > K := K + 1

    > > > else

    > > > case K of

    > > > 0 : Num := Num + Buf[i];

    > > > 1 : kNo := kNo + Buf[i];

    > > > 2 : kMemo := kMemo + buf[i];

    > > > 3 : Name := Name + buf[i];

    > > > 4 : Dept := Dept + buf[i];

    > > > 5 : Day := Day + buf[i];

    > > > end;

    > > > kNo := Trim(kNo);

    > > > kMemo := Trim(kMemo);

    > > > Name := Trim(Name);

    > > > Dept := Trim(Dept);

    > > > Day := Trim(Day);

    > > > with Query1 do

    > > > begin

    > > > SQL.Clear;

    > > > SQL.Add('insert into test');

    > > > SQL.Add('values(:r1,:r2,:r3,:r4,:r5)');

    > > > { SQL.Add('update test');

    > > > SQL.Add('Number =:r1,');

    > > > SQL.Add('kMemo =:r2,');

    > > > SQL.Add('Name =:r3,');

    > > > SQL.Add('Dept =:r4,');

    > > > SQL.Add('Day =:r5,');}

    > > > Query1.ParambyName('r1').AsString := kNo;

    > > > Query1.ParambyName('r2').AsString := kMemo;

    > > > Query1.ParambyName('r3').AsString := Name;

    > > > Query1.ParambyName('r4').AsString := Dept;

    > > > Query1.ParambyName('r5').AsString := Day;

    > > > ExecSQL;

    > > > end;

    > > > end;

    > > > end;

    > > > end;

    > > > end;

    > > >

    > > > procedure TForm1.exitExecute(Sender: TObject);

    > > > begin

    > > > close;

    > > > end;

    > > >

    > > > end.