DBにCSVから読み込んだ8〜10桁の数字文字列を登録するときに下記のようなエラーが表示されます。
※またエラー処理で次のデータに進みたいです
ご存知の方ご指導よろしくお願いします。
DB:interbase(FireBird)
LIMITSUM DECIMAL(10,0)
エラー内容
SQL error code=-206
Column unknown
LIMITSUM
Client SQL dialect 1 does not support reference to BIGINT datatype
procedure TForm1.Button1Click(Sender:TObject);
var
SL1:TStringList;
SL2:TStringList;
i,j:Word;
begin
try
IBDatabase1.Connected:=Active;
SL1:=TstringList.Create;
SL2:=TstringList.Create;
if Opendialog1.Execute then begin
SL1.LoadFromFile(Opendialog1.FileName);
for i:=0 to SL1.Count-1 do begin
SL2.CommaText := SL1[i];
IBQuery1.Close;
IBQuery1.SQL.Clear;
IBQuery1.SQL.Add('insert into customer');
IBQuery1.SQL.Add('(LIMITSUM)');
IBQuery1.SQL.Add('VALUES');
IBQuery1.SQL.Add('(:LIMITSUM)');
IBQuery1.ParamByName('LIMITSUM').AsInteger:=StrTOInt(SL2[30]);
Try
IBQuery.ExecSQL;
except begin
エラー処理
エラーレコードを登録しないで次のレコードに進みたい
end;
end;
end;
end;
Finally
SL1.Free;
SL2.Free;
IBQuery1.Active := False;
IBDatabase1.Connected:=False;
end;
end;
InterBaseで作成した項目がInteger型ではないですか?
dialect 1で作成しているIntger型では桁数が足らなくなったようです。
項目を他の型にするしかないですね。
HOtaさんありがとうございます。
DECIMAL(10,0)からInteger型にしてみます。
ありがとうございました。
DECIMAL(10,0)でエラーが起きているなら、InterBase側のエラーではないですね。
> IBQuery1.ParamByName('LIMITSUM').AsInteger:=StrTOInt(SL2[30]);
でInteger型で登録しようとしているからではないですか?これをAsFloatにしてみたらどうでしょう。
もう少し、情報を見せてください。
HOtaさんありがとうございます。
DECIMAL(10,0)からInteger型に変更したらOKでした。
StrTOInt(SL2[30]);のStrTOIntでエラーにならないか
SL2[30]をStrTOIntの前にチェックする方法はありませんか?
よろしくお願いいたします。
StrToInt 関数は有効な数値でない場合、EConvertError 例外を生成するので、
try..except 文で、例外生成時の処理を記述することができます。
あるいは、有効な数値でない場合に、-1とか0とか決まった値を
格納するのであれば、StrToIntDef 関数を使用することもできます。
igyさん、ありがとうございます。
StrToIntDef 関数というのがあるんですね!
知りませんでした。
ありがとうございました。
完了
ツイート | ![]() |