SQL查询到标量结果C#

时间:2011-05-02 19:31:23

标签: c# sql

在某些编程上下文中,从SQL查询中获取标量值很简单:

RowCount = Connection.Execute("SELECT Count(*) FROM TableA").Fields(0).Value

在C#中,给定一个已经打开的SqlConnection变量conn,是否有更简单的方法来完成同样的事情,而无需费力地创建一个SqlCommand,一个DataReader,总共需要大约5行才能完成工作

5 个答案:

答案 0 :(得分:11)

SqlCommand有一个执行你想要的ExecuteScalar方法。

 cmd.CommandText = "SELECT COUNT(*) FROM dbo.region";
 Int32 count = (Int32) cmd.ExecuteScalar();

答案 1 :(得分:3)

如果你可以使用LINQ2SQL(或EntityFramework),你可以简化实际的查询要求

using (var context = new MyDbContext("connectionString"))
{
    var rowCount = context.TableAs.Count();
}

与手动创建所有SqlCommands等相比,LINQ2SQL是一个具有许多其他好处的选项。

答案 2 :(得分:2)

ExecuteScalar至少可以保存DataReader

static public int AddProductCategory(string newName, string connString)
{
    Int32 newProdID = 0;
    string sql =
        "INSERT INTO Production.ProductCategory (Name) VALUES (@Name); "
        + "SELECT CAST(scope_identity() AS int)";
    using (SqlConnection conn = new SqlConnection(connString))
    {
        SqlCommand cmd = new SqlCommand(sql, conn);
        cmd.Parameters.Add("@Name", SqlDbType.VarChar);
        cmd.Parameters["@name"].Value = newName;
        try
        {
            conn.Open();
            newProdID = (Int32)cmd.ExecuteScalar();
        }
        catch (Exception ex)
        {
            Console.WriteLine(ex.Message);
        }
    }
    return (int)newProdID;
}

(取自this MSDN documentation article

的例子

答案 3 :(得分:1)

调查Command.ExecuteScalar:

using(var connection = new SqlConnection(myConnectionString))
{
    connection.Open();
    using(var command = connection.CreateCommand())
    {
        command.CommandType = CommandType.Text;
        command.CommandText = mySql;
        var result = (int)command.ExecuteScalar();
    }
}

如果你真的很懒,那么就像我们一样将它全部封装在扩展方法中。

编辑:根据要求,扩展方法:

public static T ExecuteScalar<T> (this SqlConnection connection, string sql)
{
    if (connection == null)
    {
        throw new ArgumentNullException("connection");
    }

    if (string.IsNullOrEmpty(sql))
    {
        throw new ArgumentNullException("sql");
    }

    using(var command = connection.CreateCommand())
    {
        command.CommandText = sql;
        command.CommandType = CommandType.Text;
        return (T)command.ExecuteScalar();
    }
}

注意,此版本假定您已事先正确构建了SQL。我可能会创建这个扩展方法的单独重载,它带有两个参数:存储过程名称和List。这样,您就可以保护自己免受不必要的SQL注入攻击。

答案 4 :(得分:1)

您不需要DataReader。此示例将拉回标量值:

Object result;
using (SqlConnection con = new SqlConnection(ConnectionString)) {
       con.Open();
       using (SqlCommand cmd = new SqlCommand(SQLStoredProcName, con)) {
       result = cmd.ExecuteScalar();
      }
}