如何使用 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】:

不建议使用DataReaderCommand.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 自动附加整数以复制列值

ExecuteReader 需要打开的连接

ExecuteReader()获得数据

如何在C#中将ExecuteReader转换为Json对象

SQLDataReader 在 ExecuteReader 之后读取为空

ExecuteNonQuery,ExecuteReader,ExecuteScalar 区别