简体   繁体   English

为什么只有使用单独的字段时,SqlDataReader才能使用DataTable?

[英]Why SqlDataReader to DataTable only works if I use a separate field?

We have a quiet large SQL Server database (about 30 million rows in the biggest tables). 我们有一个安静的大型SQL Server数据库(最大的表中大约有3000万行)。 When I try to run a stored procedure on it I have a strange problem. 当我尝试在其上运行存储过程时,我有一个奇怪的问题。 It is working if I use this code: 如果我使用这段代码它是有效的:

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);

But it is running forever if I use this one: 但如果我使用这个,它会永远运行:

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());      

What can cause this? 是什么导致这个?

You may be playing var roulette. 你可能正在玩var roulette。 The var declaration determines the type of variable automatically. var声明自动确定变量的类型。 And when you embed cmd.ExecuteReader() within table.load, you're avoiding that declaration process. 当你在table.load中嵌入cmd.ExecuteReader()时,你就避免了这个声明过程。 Instead, try explicitly casting cmd.ExecuteReader() with SqlDataReader via table.load on your second code snippet. 相反,尝试在第二个代码片段中通过table.load使用SqlDataReader显式地生成cmd.ExecuteReader()。

Link to C# var reference 链接到C#var reference

"Beginning in Visual C# 3.0, variables that are declared at method scope can have an implicit type var. An implicitly typed local variable is strongly typed just as if you had declared the type yourself, but the compiler determines the type..." “从Visual C#3.0开始,在方法范围声明的变量可以有一个隐式类型var。隐式类型的局部变量是强类型的,就像你自己声明了类型一样,但编译器确定类型......”

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM