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