如何使用 executeReader() 方法仅检索一个单元格的值
Posted
技术标签:
【中文标题】如何使用 executeReader() 方法仅检索一个单元格的值【英文标题】:How to use executeReader() method to retrieve the value of just one cell 【发布时间】:2011-08-13 06:21:46 【问题描述】:我需要执行以下命令并将结果传递给标签。我不知道如何使用 Reader 来做到这一点。有人可以帮帮我吗?
String sql = "SELECT * FROM learer WHERE learer.id = " + index;
SqlCommand cmd = new SqlCommand(sql,conn);
learerLabel.Text = (String) cmd.ExecuteReader();
如您所见,我创建了 SQL 语句并执行了它,但它不起作用。为什么?
控制台说:
不能隐式 SqlDataReader 到 字符串...
我怎样才能得到想要的结果作为字符串,以便标签可以正确显示它。
【问题讨论】:
你的代码容易被sql注入 Using select count(*) in c# 的可能重复项 【参考方案1】:using (var conn = new SqlConnection(SomeConnectionString))
using (var cmd = conn.CreateCommand())
conn.Open();
cmd.CommandText = "SELECT * FROM learer WHERE id = @id";
cmd.Parameters.AddWithValue("@id", index);
using (var reader = cmd.ExecuteReader())
if (reader.Read())
learerLabel.Text = reader.GetString(reader.GetOrdinal("somecolumn"))
【讨论】:
"reader.GetString(reader.GetOrdinal("somecolumn"))" 是检索文本值的最简单方法?没有什么像 reader.fieldByName("Name").asString ? 感谢您向我展示了如何使用ExecuteReader()
而不是问题中提出的 Scalar
附注你不能只用表名来做这个变量【参考方案2】:
不建议使用DataReader
和Command.ExecuteReader
从数据库中仅获取一个 值。相反,您应该使用Command.ExecuteScalar
,如下所示:
String sql = "SELECT ColumnNumber FROM learer WHERE learer.id = " + index;
SqlCommand cmd = new SqlCommand(sql,conn);
learerLabel.Text = (String) cmd.ExecuteScalar();
Here 是关于连接到数据库和管理数据的更多信息。
【讨论】:
"SELECT ColumnNumber FROM learer WHERE learer.id = " + index
可能存在SQL injection attack 漏洞。而是使用参数化查询,如 e.g. this answer。请参阅:Why do we always prefer using parameters in SQL statements? 和 software-security.sans.org/developer-how-to/…【参考方案3】:
ExecuteScalar()
是你需要的
【讨论】:
【参考方案4】:Duplicate question 基本上说使用 ExecuteScalar()
代替。
【讨论】:
以上是关于如何使用 executeReader() 方法仅检索一个单元格的值的主要内容,如果未能解决你的问题,请参考以下文章
如何防止 OleDbDataReader.ExecuteReader 自动附加整数以复制列值