CSVファイルをDBへ転送したいです


CSVファイル(カンマ区切り)  2008-10-28 21:10:48  No: 32390  IP: 192.*.*.*

CSVファイル(カンマ区切り)を読み込んで、読み込んだレコードと、
それに対応するDB(Oracle)内レコードを更新するツールを作成しているのですが、困っています。
現在作成中のコードはコチラ↓

procedure TForm7.Button5Click(Sender: TObject);
 function RemoveToken(var s:string;delimiter:string):string;
  begin //読み込んだ文字列を、
          カンマ区切りで切り取る関数(内容省略)
  end;
var
s: string;
csvFile : TextFile;
FieldData : array [1..12] of string;

begin

AssignFile(csvFile,'アドレス\ファイル名.csv');
Reset(csvFile);

try
  try
    while not Eof(csvFile) do
      begin
        Readln(csvFile,s);  
//Fielddataにカンマで切り取った文字を格納していく
            Fielddata[1] := RemoveToken(s,delimiter);
            Fielddata[2] := RemoveToken(s,delimiter);
            Fielddata[3] := RemoveToken(s,delimiter);
            Fielddata[4] := RemoveToken(s,delimiter);
            Fielddata[5] := RemoveToken(s,delimiter);
            Fielddata[6] := RemoveToken(s,delimiter);
            Fielddata[7] := RemoveToken(s,delimiter);
            Fielddata[8] := RemoveToken(s,delimiter);
            Fielddata[9] := RemoveToken(s,delimiter);
            Fielddata[10] := RemoveToken(s,delimiter);
            Fielddata[11] := RemoveToken(s,delimiter);
            Fielddata[12] := RemoveToken(s,delimiter);

           Query1.sql.clear;
//条件にあてはまるレコードを更新
           Query1.sql.add
           ('update MEIBO set カラム1 = :Fielddata[1] 
            where  カラム2 = :Fielddata[2]
            and カラム7 = :Fielddata[7] 
            and カラム9 = :Fielddata[9]
            and カラム11 = :Fielddata[11] 
            and カラム12 = :Fielddata[12]');
//パラメータに値を代入
           Query1.Params[0].Asstring := Fielddata[1];
           Query1.Params[1].Asstring := Fielddata[2];
           Query1.Params[2].Asstring := Fielddata[7];
           Query1.Params[3].Asstring := Fielddata[9];
           Query1.Params[4].Asstring := Fielddata[11];
           Query1.Params[5].Asstring := Fielddata[12];

           Query1.ExecSQL;

       end;
  except
   raise Exception.create('データを読み込めません');
  end;
 Finally
  CloseFile(csvFile);
 end;
 messageDlg('データ転送終了',mtConfirmation,[mbok],0);
end;

と、これでできるかと思うのですが、
「Query1.ExecSQL;」の時点で固まってしまいます。
(カーソルが砂時計SQLのままです。)
エラーメッセージは出ないので、何が間違っているのかわからない状態です。


どこか間違っていれば教えてください。
また、違う方法があればそちらもよろしくお願いします。
この方法だと何千件ものデータを処理するには
あまりにもスマートじゃない気が・・・。

長文失礼いたしました。

編集 削除
すいません、  2008-10-28 22:01:49  No: 32391  IP: 192.*.*.*

バージョンはDelphi3
環境はWindows  XP  です。。。

宜しくお願いいたします。

編集 削除
通りすがり  2008-10-28 22:11:30  No: 32392  IP: 192.*.*.*

一回一回SQL作り直すなら、パラメータ化する必要ないと思うけど?

編集 削除
ありがとうございます  2008-10-28 22:15:30  No: 32393  IP: 192.*.*.*

具体的にわかるように、パラメータ書いたんですが、
逆にわかりづらかったですかね。すいません。

編集 削除
igy  2008-10-28 22:36:41  No: 32394  IP: 192.*.*.*

パラメータ を使わない UPDATE 文 の場合は、正しく動作するのですか?

編集 削除
ありがとうございます  2008-10-28 23:29:57  No: 32395  IP: 192.*.*.*

ですね、パラメータ指定必要でした。すいません。
だとしたらこの文で問題ないですよね?

編集 削除
igy  2008-10-28 23:55:24  No: 32396  IP: 192.*.*.*

>ですね、パラメータ指定必要でした。すいません。

私が

>パラメータ を使わない UPDATE 文 の場合は、正しく動作するのですか?

と聞いたのは、

update MEIBO set カラム1 = 'ZZZZZ' 
            where  カラム2 = 'AAAAAA'


のように、パラメータを使わない UPDATE文だと、

>「Query1.ExecSQL;」の時点で固まってしまいます。
>(カーソルが砂時計SQLのままです。)

のように固まらず、処理が正常にできるのか、聞いているのですが、
正常に動くのですか?

あと、

>           ('update MEIBO set カラム1 = :Fielddata[1] 
>            where  カラム2 = :Fielddata[2]
>            and カラム7 = :Fielddata[7] 
>            and カラム9 = :Fielddata[9]
>            and カラム11 = :Fielddata[11] 
>            and カラム12 = :Fielddata[12]');

で、“:Fielddata[11]”
のように[]を付けてもOKなのですか?
(SQL 文のパラメータ関連は、今、ヘルプを見ただけなので、詳しくはないのですが)

あと、個人的な意見ですが、投稿されるとき、名前の欄は、
・すいません
・ありがとうございます
のような感じのものより、元の質問者とわかるように、
固定のもの(今回であれば、最初に使った“CSVファイル(カンマ区切り)”)を使ったほうが、よいかと思います。

編集 削除
igy  2008-10-29 01:11:20  No: 32397  IP: 192.*.*.*

あと、Oracleは使ったことがないのですが、
・Oracleには、正常に接続は出来ているのですか?
・Oracleはフィールド名を“カラム7”などのように、2バイト文字を
  使っても大丈夫なのですか?
・カンマ区切りに関しては、TStringList の CommaText プロパティを
  使うのもよいかと思います。

編集 削除
HOta  2008-10-29 20:27:10  No: 32398  IP: 192.*.*.*

このSQL分は、Where句が無いようですが、全てのレコードを更新しているのでは無いでしょうか?

編集 削除