SqlDataAdapter.Fill在给定的DataTable中不填充任何行

时间:2014-01-10 12:09:00

标签: c# sql datatable sqldataadapter

所有

这是我的代码。

private void FillData(DataTable data, FilterModel filter){
  var cmdStr = MySqlCmdGenerator.Generate(filter);
  using (var cmd = new SqlCommand(cmdStr, connection_))
  using (var da = new SqlDataAdapter(cmd)){
    da.Fill(data);
  }
}

public DataTable GetData(IEnumerable<FilterModel> filters){
  var data = new DataTable("mydata");
  foreach (var filter in filters){
    FillData(data);
  }
  return data;
}

这是一个非常简单的代码,只根据SqlDataAdapter使用Fillfilters数据表。

问题是有时候GetData方法会返回空的数据表。

首先,我在SQL Server Management Studio上执行生成的查询,并返回正确的结果(它包含大约100,000条记录)。 然后我使用Sql Server Profiler来分析服务器中发生的事情,并得到一些错误:

Sort Warnings  
RPC:Completed (TextData: Query with a given filter)  
Hash Warning  
Sort Warnings  
RPC:Completed (TextData: Query with a given filter)  
User Error Message (TextData: The statement has been terminated.)
Attention  
Audit Logout  
RPC:Completed (TextData: sp_reset_connection)

(按此顺序发生)

谷歌之后的错误,但我无法弄清楚服务器和应用程序究竟发生了什么。

任何建议都将受到赞赏。

谢谢!

1 个答案:

答案 0 :(得分:0)

.NET应用程序和SQL Server Management Studio的结果之间的差异通常是由于SQL Server连接的ANSI设置的不同配置造成的。

这假设你已经消除了明显的错误原因,例如:你无意中连接到两个环境中的不同数据库。

您可以在工具/选项/查询执行/ SQL Server / ANSI中查看SQL Server Management Studio使用的设置。在我的安装中,他们默认为:

SET ANSI_NULL_DFLT_ON ON
SET ANSI_PADDING ON
SET ANSI_NULLS ON

我建议您尝试在Management Studio中逐个关闭它们以尝试重现.NET使用的配置。一旦了解了正在发生的事情,您可以执行以下操作之一:

  • 将SET语句添加到.NET查询

  • 修改您的查询,使其不依赖于这些设置(可能需要为NULL添加ISNULL或显式测试)。

相关问题