在某些编程上下文中,从SQL查询中获取标量值很简单:
RowCount = Connection.Execute("SELECT Count(*) FROM TableA").Fields(0).Value
在C#中,给定一个已经打开的SqlConnection变量conn
,是否有更简单的方法来完成同样的事情,而无需费力地创建一个SqlCommand,一个DataReader,总共需要大约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;
}
的例子
答案 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();
}
}