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


CSVファイル(カンマ区切り)  2008-10-29 06:10:48  No: 32390

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-29 07:01:49  No: 32391

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

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


通りすがり  2008-10-29 07:11:30  No: 32392

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


ありがとうございます  2008-10-29 07:15:30  No: 32393

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


igy  2008-10-29 07:36:41  No: 32394

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


ありがとうございます  2008-10-29 08:29:57  No: 32395

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


igy  2008-10-29 08:55:24  No: 32396

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

私が

>パラメータ を使わない 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 10:11:20  No: 32397

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


HOta  2008-10-30 05:27:10  No: 32398

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


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加