所有
这是我的代码。
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
使用Fill
到filters
数据表。
问题是有时候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)
(按此顺序发生)
谷歌之后的错误,但我无法弄清楚服务器和应用程序究竟发生了什么。
任何建议都将受到赞赏。
谢谢!
答案 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或显式测试)。