为啥 SqlDataReader 到 DataTable 只有在我使用单独的字段时才有效?

Posted

技术标签:

【中文标题】为啥 SqlDataReader 到 DataTable 只有在我使用单独的字段时才有效?【英文标题】:Why SqlDataReader to DataTable only works if I use a separate field?为什么 SqlDataReader 到 DataTable 只有在我使用单独的字段时才有效? 【发布时间】:2015-05-26 05:13:26 【问题描述】:

我们有一个安静的大型 SQL Server 数据库(最大的表中大约有 3000 万行)。当我尝试在其上运行存储过程时,我遇到了一个奇怪的问题。如果我使用此代码,它就可以工作:

cmd = new SqlCommand("query", conn);    
cmd.CommandType = CommandType.StoredProcedure;    
cmd.CommandText = "StoredProcedureName";    
cmd.Parameters.Add("myParameter", myParameter);    
cmd.CommandTimeout = 600;

DataTable table = new DataTable();    
var restmp = cmd.ExecuteReader();    
table.Load(restmp);

但如果我使用这个,它将永远运行:

cmd = new SqlCommand("query", conn);    
cmd.CommandType = CommandType.StoredProcedure;    
cmd.CommandText = "StoredProcedureName";    
cmd.Parameters.Add("myParameter", myParameter);    
cmd.CommandTimeout = 600;

DataTable table = new DataTable();    
table.Load(cmd.ExecuteReader());      

这是什么原因造成的?

【问题讨论】:

你用完全相同的参数值调用它吗? 是的,当然。但是我尝试了很多不同的值。 (实际上我有多个参数。)每次我使用第一种方法时,它都会起作用,而每次我使用第二种方法时,它却不起作用。 您说它一直在运行,但它在哪里阻塞? 在'table.Load(cmd.ExecuteReader());'行。 是的,在每张桌子上。 【参考方案1】:

您可能正在玩 var 轮盘赌。 var 声明自动确定变量的类型。当您在 table.load 中嵌入 cmd.ExecuteReader() 时,您就避免了该声明过程。相反,请尝试通过 table.load 在第二个代码 sn-p 上使用 SqlDataReader 显式转换 cmd.ExecuteReader()。

Link to C# var reference

“从 Visual C# 3.0 开始,在方法范围内声明的变量可以具有隐式类型 var。隐式类型的局部变量是强类型的,就像您自己声明了该类型一样,但编译器会确定输入...”

【讨论】:

以上是关于为啥 SqlDataReader 到 DataTable 只有在我使用单独的字段时才有效?的主要内容,如果未能解决你的问题,请参考以下文章

为啥要使用 SqlDataReader 的 GetOrdinal() 方法

使用表达式目录树实现SqlDataReader到实体的映射

将SqlDataReader的结果映射到对象的最快方法

将 SqlDataReader 的结果映射到对象的最快方法

SqlDataReader 在尝试将数据加载到 DataGrid WPF 时抛出异常

C# 使用 SqlDataReader 从 SQL Server 检索数据到主详细信息列表