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のままです。)
エラーメッセージは出ないので、何が間違っているのかわからない状態です。
どこか間違っていれば教えてください。
また、違う方法があればそちらもよろしくお願いします。
この方法だと何千件ものデータを処理するには
あまりにもスマートじゃない気が・・・。
長文失礼いたしました。
バージョンはDelphi3
環境はWindows XP です。。。
宜しくお願いいたします。
一回一回SQL作り直すなら、パラメータ化する必要ないと思うけど?
具体的にわかるように、パラメータ書いたんですが、
逆にわかりづらかったですかね。すいません。
パラメータ を使わない UPDATE 文 の場合は、正しく動作するのですか?
ですね、パラメータ指定必要でした。すいません。
だとしたらこの文で問題ないですよね?
>ですね、パラメータ指定必要でした。すいません。
私が
>パラメータ を使わない 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ファイル(カンマ区切り)”)を使ったほうが、よいかと思います。
あと、Oracleは使ったことがないのですが、
・Oracleには、正常に接続は出来ているのですか?
・Oracleはフィールド名を“カラム7”などのように、2バイト文字を
使っても大丈夫なのですか?
・カンマ区切りに関しては、TStringList の CommaText プロパティを
使うのもよいかと思います。
このSQL分は、Where句が無いようですが、全てのレコードを更新しているのでは無いでしょうか?
ツイート | ![]() |