为什么只有在使用单独的字段时,SqlDataReader转换为DataTable才有效?

3
我们有一个相当大的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());      

什么会导致这种情况发生?

1
你使用完全相同的参数值来调用它吗? - Mitch Wheat
当然可以。但是我尝试了很多不同的值。(实际上我有多个参数。)每次当我使用第一种方法时,它都有效,而每次当我使用第二种方法时,它都无效。 - Kiss László
2
你说 它一直在运行,但它在哪里被阻塞了? - Sriram Sakthivel
是的,在每张表上。 - Kiss László
你应该将这样的代码封装在 using 语句 中。这个页面上有一个很好的例子 https://msdn.microsoft.com/en-us/library/9kcbe65k(v=vs.110).aspx。 - BCdotWEB
显示剩余2条评论
1个回答

0

你可能正在玩 var 轮盘。var 声明会自动确定变量的类型。当你将 cmd.ExecuteReader() 嵌入到 table.load 中时,你避免了这个声明过程。相反,尝试使用第二段代码片段中的 SqlDataReader 通过 table.load 显式地转换 cmd.ExecuteReader()。

C# var 参考链接

"从 Visual C# 3.0 开始,方法作用域中声明的变量可以具有隐式类型 var。隐式类型的局部变量与您自己声明类型一样强类型化,但编译器确定类型..."


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接