お世話になります。
WindowsXP+Delphi2007+Office2003環境下でOracleテーブルデータをAccessへコピー処理を実行しています。
Oracleを読み込むのにTSQLConnection、TSQLQuery、TDataSetProvider、TClientDataSet、TDataSource
Accessを読み込むのにTADOConnection、TADOQuery を使用しています。
そして下記のようなコードを実行したところ、今まで取り扱ったデータについては
開発環境、および実行環境で問題なく動いていましたが、
今回取り扱ったデータ(とても長い文字列データでカラム数十あり、それぞれ数千〜数万バイトの文字列が格納されています)
については、前者は問題なしで後者は1件のみレコードコピーされませんでした。
下記プログラムではAccessテーブルデータをOracleへコピーする処理も実行しているため
上記のような部品の使い方をしていますが、Oracle→AccessについてはTClientDataSetは
不要だと思い、TDataSetProviderへのTSQLQueryの設定を解除したら実行環境でも問題なく動作するようになりましたが、
なぜにこの変更で動くようになったのか分かりません。(開発環境と実行環境の差異?)
上記対処で解決した理由または下記コードの問題など分かる方教えて頂けませんか。
*****実行しているプログラムの抜粋*****
function TmodData.OracleToMdb: Boolean;
var
arySFields: TStringList;
aryDFields: TStringList;
strText, strValue: String;
intCount, intTable, intPlus: Integer;
begin
Result := False;
//Self.sqlTable.SchemaName:= Self.clsIniFIle.Scheme;
if Self.ConnectOracle True then Exit;
if Self.ConnectAccess True then begin Self.sqlConnection.Close;Exit; end;
for intTable := 0 to Self.clsIniFIle.OTableAry.Count - 1 do
begin
Self.sqlTable.TableName := Self.clsIniFile.Scheme + . + Self.clsIniFIle.OTableAry[intTable];
Self.adoTable.TableName := Self.clsIniFIle.MTableAry[intTable];
arySFields := TStringList.Create;
aryDFields := TStringList.Create;
arySFields.CommaText := Self.clsIniFIle.OFieldsAry[intTable];
aryDFields.CommaText := Self.clsIniFIle.MFieldsAry[intTable];
Self.adoTable.Open;
Self.adoTable.First;
while not Self.adoTable.Eof do Self.adoTable.Delete;
Self.sqlTable.Open;
Self.sqlTable.First;
while not Self.sqlTable.Eof do
begin
Self.adoTable.Append;
for intCount := 0 to arySFields.Count - 1 do
Self.adoTable.FieldByName(aryDFields.Strings[intCount]).Value := Self.sqlTable.FieldByName(arySFields.Strings[intCount]).Value;
Self.adoTable.Post;
Self.sqlTable.Next;
end;
aryPlus.Free;
arySFields.Free;
aryDFields.Free;
Self.adoTable.Close;
Self.sqlTable.Close;
Application.ProcessMessages;
end;
Self.adoConnection.Close;
Self.sqlConnection.Close;
Result := True;
end;
ツイート | ![]() |