【发布时间】:2013-08-13 22:36:12
【问题描述】:
请注意,这个问题是我尚未解决的当前问题的一个分支:
Need help resolving an error when WCF service returns DataTable: OutOfMemoryException
我有一个现有的 WCF 服务,其端点配置为 TransferMode.Buffered 和一个客户端应用程序,其连接要求相同。
OperationContracts 是既定的方法,除了非常小的方法外,我无法轻易修改。例如,我们有一个接受 SQL 查询 String 并返回从 SQL 执行派生的 DataTable 的方法。
我们在使用这种方法处理非常大的表时遇到了问题。大意味着内存占用。
我正在考虑实现TransferMode.Streamed(或类似的),但我似乎无法掌握如何仅针对某些方法执行此操作。
我的 WCF 服务启动,创建了唯一的端点,该端点是 Buffered。所以这让我们想要假设它是全有或全无。如果我改为Streaming,那么我将不得不对我所有的OperationContract 方法进行大规模返工。
有一些 SO 问题与这个主题有关,但不是直接的,也没有任何真正能把我带到我需要去的地方的答案。
是我遗漏了什么,还是可以让它工作?
我需要修复的方法:(如果想了解连接,请参考引用的问题……代码很多)
WCF 服务代码:
[OperationContract]
DataTable readDataTable(out DbError dbError, String queryString, Boolean SchemaOnly);
public DataTable readDataTable(out DbError dbError, String queryString, Boolean SchemaOnly)
{
DataTable dt = new DataTable("ReturnTable");
dbError = new DbError();
if (!String.IsNullOrEmpty(queryString))
{
try
{
command.CommandText = queryString.Replace(new String[] { "{{", "}}", ";;" }, new String[] { "{", "}", ";" });
SqlDataReader reader = command.ExecuteReader(SchemaOnly ? CommandBehavior.SchemaOnly : CommandBehavior.Default);
dt.Load(reader);
reader.Close();
}
catch (Exception ex)
{
dbError.HasError = true;
dbError.Error = ex.Message + "\n\n" + queryString;
}
}
return dt;
}
使用它的客户端代码:
public DataTable readDataTable(String queryString, Boolean SchemaOnly)
{
DbError dbError;
DataTable dt = svcCon.readDataTable(out dbError, queryString, SchemaOnly);
if (dbError.HasError)
{
if (_showErrors)
ErrorHandler.Show(dbError.Error);
}
return dt;
}
【问题讨论】: