📜  executescalar 和 executenonquery 和 executereader 之间的区别 - C# (1)

📅  最后修改于: 2023-12-03 15:14:56.842000             🧑  作者: Mango

executescalar 和 executenonquery 和 executereader 之间的区别

在C#中,与SQL Server数据库交互时可以使用以下方法之一:

  1. ExecuteScalar(): 用于执行查询并返回单个值,通常用于在查询中使用聚合函数(如SUM,AVG,COUNT等)。

  2. ExecuteNonQuery(): 用于执行插入,更新或删除SQL语句并返回受影响的行数。

  3. ExecuteReader(): 用于执行查询并返回结果集,通常用于需要遍历结果集的场景。

下面我们将更详细地了解这3种方法之间的不同:

ExecuteScalar()

ExecuteScalar方法用于执行一个查询并返回查询结果中的第一行第一列。通常用于需要返回单个值的查询,如下面的例子:

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT COUNT(*) FROM MyTable"; // 查询MyTable中的记录数量
int rowCount = (int)cmd.ExecuteScalar(); // 返回查询结果中的第一行第一列,即记录数量

值得注意的是,即使查询的结果集包含多个行和列,ExecuteScalar方法也只返回结果集中的第一行第一列。

ExecuteNonQuery()

ExecuteNonQuery方法用于执行插入,更新或删除SQL语句,并返回受影响的行数。通常用于数据更新操作,如下面的例子:

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "UPDATE MyTable SET Column1 = @Value1 WHERE ID = @ID"; // 更新MyTable表中ID为@ID的行的Column1列为@Value1
cmd.Parameters.AddWithValue("@ID", 1);
cmd.Parameters.AddWithValue("@Value1", "NewValue");
int rowsAffected = cmd.ExecuteNonQuery(); // 返回受影响的行数

注意,ExecuteNonQuery方法不返回查询结果集,仅返回受影响的行数。

ExecuteReader()

ExecuteReader方法用于执行查询并返回结果集。通常用于需要遍历结果集的情况,如下面的例子:

SqlCommand cmd = new SqlCommand();
cmd.Connection = conn;
cmd.CommandText = "SELECT * FROM MyTable";
SqlDataReader reader = cmd.ExecuteReader(); // 返回结果集
while(reader.Read())
{
    Console.WriteLine(reader.GetString(0)); // 输出第一列的值
}
reader.Close();

ExecuteReader方法返回一个SqlDataReader对象,它可以使用Read()方法逐行读取结果集。值得注意的是,在使用完SqlDataReader对象后,必须调用Close()方法显式地关闭它。

总结

SqlCommand类提供了执行SQL查询的多种方法,每种方法都适用于不同的场景。在使用这些方法时,请根据实际需求选择合适的方法,以获得最佳性能和最好的用户体验。