为啥 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() 方法