我正在使用 Delphi XE2 调用返回数据的存储过程。存储过程基本上是:
set nocount on -- ensures that Delphi will see that dataset
...
exec StoredProcThatReturnsData
...
update [table]
update [another table]
当主过程是 T-SQL 过程时,它会在将数据返回给 Delphi之前update
完成包括最后语句的主过程的执行。
update
当主过程是 CLR 过程时,它会在子过程完成执行时返回数据,并且在我关闭TSQLQuery
Delphi 中的对象之前不会运行语句。
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);
}
}
}
为什么 T-SQL 过程在返回数据之前完成执行,而 CLR 过程等待运行update
语句,直到 Delphi 关闭/销毁rpt
查询之后?