-1

会社で BDE を ADO に変換する作業を行っています。ADO に変換する方法がわからない式に遭遇しました

これは、1つを除くすべてのADO変更を含むBDE式です....私の問題を引き起こしている部分は

最初に Tquery.Create(nil) を使用します。何か案は?

  with Tquery.Create(nil) do
        begin
            cmd := TStringList.Create;
            cmd.Add('select top 3 csnttext from casenotesint');
            cmd.Add('where csntcaseid = ''' + scasenum + ''' ');
            cmd.Add('and csntclmid = ''' + sclmnumber + ssplitcode + ''' ');
            cmd.Add('order by csntseqnum desc');
            rs := fConnection.Execute(cmd.Text);
            cmd.Free;

            while not Eof do
            begin
                SAPrintReport1.Tab(0.5);
                SAPrintReport1.Print(rs.Fields.Item('CsNtText').Value);
                SAPrintReport1.NewLine;
                rs.next;
            end;
            rs.Close;
        end;
        if cbxSpacer.checked then
        begin
            SAPrintReport1.NewLine;
            SAPrintReport1.NewLine;
            SAPrintReport1.NewLine;
        end;
4

3 に答える 3

2

withステートメントは、指定されたオブジェクトのメンバーをスコープに入れるため、そのフィールド、メソッド、およびプロパティを、それらが属するオブジェクトの名前で修飾しなくても言及できます。ドキュメントのWith ステートメントを参照してください。

ステートメントに入れるのに有効なものの 1 つwithは、新しく作成されたばかりのオブジェクトです。それがここにあります。コードは新しいTQueryオブジェクトを作成し、すぐにそのすべてのメンバーを暗黙的に使用します。そのオブジェクトへの参照はどのローカル変数にも格納されていないため、明示的に参照する方法はありませんが、コンパイラは気にしません。(ただし、これは人間を悩ませる可能性があります。これが、人々がwithDelphi で の使用を思いとどまらせる理由の 1 つです。)

指定されたオブジェクトに属さない識別子は、代わりに次の周囲のスコープで検索されます。そのブロックTQueryで使用されている唯一の識別子は であるように見えるので、変換しているコードはおそらく間違っています。コードが何をするべきかを理解してから、そのための新しい ADO コードを作成する方がよい場合がありますwithEof

于 2010-06-30T20:15:10.057 に答える
1

IMO、try..finally..free..end; を使用する必要があります。そうしないと、クエリが作成され、解放されません。つまり、2 行目は「try」にする必要があります。

with Tquery.Create(nil) do 
try
  ..  
  ..  
finally
  free;
end; 
于 2010-06-30T19:58:09.273 に答える
1

TQuery を TADOQuery に変更しようとしましたが、どうなりますか?

于 2010-06-30T19:39:09.383 に答える