0

Delphi XE2 を使用して、データを返すストアド プロシージャを呼び出しています。ストアド プロシージャは基本的に次のとおりです。

set nocount on -- ensures that Delphi will see that dataset
...
exec StoredProcThatReturnsData
...
update [table]
update [another table]

メイン プロシージャが T-SQL プロシージャの場合、 Delphiにデータを返す前に、最後のupdateステートメントを含むメイン プロシージャの実行を終了します。

メイン プロシージャが CLR プロシージャの場合、サブ プロシージャの実行が終了した時点でデータが返され、Delphiupdateでオブジェクトを閉じるまでステートメントは実行されません。TSQLQuery

Delphi コードは次のようになります。

rpt := TSQLQuery.Create(nil);
try
  rpt.MaxBlobSize := -1;
  rpt.SQLConnection := ASqlConnection;
  rpt.SQL.Text := 'exec RunMainProc';
  rpt.Open;
  // do some things that depend on the update statements
  // process the 'rpt' data
finally
  FreeAndNil(rpt);
end;

CLR プロシージャは次のようになります。

[Microsoft.SqlServer.Server.SqlProcedure]
public static void RunReport(SqlGuid ReportID, SqlGuid UserID, SqlBoolean ForDownload)
{
  using (SqlConnection con = new SqlConnection("context connection=true"))
  {
    con.Open();
    using (SqlCommand cmd = new SqlCommand())
    {
      cmd.Connection = con;
      cmd.CommandText = "[identical SQL as T-SQL proc]";
      SqlContext.Pipe.ExecuteAndSend(cmd);
    }
  }
}

Delphi がクエリupdateを閉じる/破棄するまでCLR プロシージャがステートメントの実行を待機している間に、T-SQL プロシージャがデータを返す前に実行を終了するのはなぜですか?rpt

4

2 に答える 2

1

Jeroen のおかげで、Delphi 以外の場所から実行しようとしたところ、問題が見つかりました。

T-SQL プロシージャを CLR に変換するときに、サブプロシージャにデバッグ コードを追加しました。これにより、1 つではなく 2 つのデータセットが返さまし。メイン プロシージャの実行が完了する前に、プロシージャの CLR バージョンがデータを返す原因となったのは、2 番目の保留中のデータセットでした。

デバッグ コードを削除すると(生成されるデータセットは1 つだけになりました)、プロシージャの T-SQL バージョンと CLR バージョンはまったく同じように実行されました。データが Delphi に返される前に、メイン プロシージャの実行が終了しました。

于 2012-09-28T15:59:28.467 に答える
0

あなたの SP はレコードを返しますか? ti はないようです。次に、Open on Query を呼び出さないでください。Open は、データ行を取得するために DataSet を準備します。要求が長くなる可能性があるため、必要に応じて取得します。TDataSet.NextTDataSet.Lastなどを呼び出す場合。.Open の後に SP と同期したい場合は、 rpt.Last を呼び出すことができます

しかし、正しい方法はOpenをまったく使用せず、代わりにExecSQLを使用することです。

http://docs.embarcadero.com/products/rad_studio/delphiAndcpp2009/HelpUpdate2/EN/html/delphivclwin32/SqlExpr_TSQLQuery_ExecSQL.html

PS: C#では、 OpenではなくSqlContext.Pipe.Executeを呼び出します。同じことが、ある意味で .Net および OLE DB のモデルであった Delphi にも当てはまると予想されます。

于 2012-09-28T10:25:29.073 に答える