Sql中的SqlDataReader.Read()总是为false

时间:2016-02-25 15:48:12

标签: c# sql

我的本​​地数据库TrackerHitResult中有一个表。我正在为Ships(HistID,ShipName,ShipLength)的所有船只轮询数据库,但从未输入HistID == theme。另外,我的Ships表有多行(在另一个SO问题中看到了这个问题)所以我不确定为什么我不能将结果存储到元组列表中。在Visual Studio 2015中单独执行查询会产生正确的结果。

while(reader.Read()){}

EDIT ::根据建议删除了查询中的单引号,但仍然存在同样的问题。

2 个答案:

答案 0 :(得分:3)

您的theme类型为int,并且您将其用单引号括起来,就像它是字符串值一样。删除引号,但更重要的是,使用参数

cmd = new SqlCommand(string.Format(@"Select ShipName, ShipLength from Ships Where HistID={0}", theme), db);

永远不要使用字符串连接/字符串格式来构建SQL语句,您的代码很容易SQL injection

cmd = new SqlCommand(@"Select ShipName, ShipLength from Ships Where HistID=@theme", db);
cmd.Parameters.AddWithValue("@theme", theme);
//Or more precise 
//cmd.Parameters.Add(new SqlParameter("@theme", SqlDbType.Int) {Value = theme});

您没有获得任何行的原因是,您的字段HistID是数字类型,并且您正在尝试将其与字符串值进行比较(通过将值括在单引号中)< / em>的。

答案 1 :(得分:1)

删除HasRows检查并使用.Read while循环;关于HasRows的各种错误报告在某些情况下并不完全准确。

除此之外,你可能会在某个地方犯错误。 theme不是您所期望的,或者是某些环境错误,例如命中错误的数据库。