我只询问sync
类的SqlCommand
种方法。
有三种方法(众所周知) - ExecuteReader()
,ExecuteScalar()
和ExecuteNonQuery()
。
哪种方法更适合存储过程如下:
CREATE PROCEDURE [dbo].[pr_test]
@partherId UNIQUEIDENTIFIER,
@lowerBound SMALLINT = -1 out,
@upperBound SMALLINT = -1 out
AS
BEGIN
SET NOCOUNT ON;
SELECT
@lowerBound = ISNULL(MIN(SrartDayNumber), -1)
,@upperBound = ISNULL(MAX(EndDayNumber), -1)
FROM [CpsOther].[dbo].[FinDocument] f
WHERE f.partherId = @partherId
END
我只需要out
参数而不需要其他任何内容。我不知道SqlCommand
哪种方法更适合这种情况?或者它并不重要。 (结果相同)
int lowerBound = -1;
int upperBound = -1;
using (SqlConnection connection = new SqlConnection(_connectionString))
{
using (SqlCommand command = new SqlCommand())
{
command.Connection = connection;
command.CommandType = CommandType.StoredProcedure;
command.CommandText = "[dbo].[pr_test]";
SqlParameter lowerBoundParam = new SqlParameter
{
ParameterName = "@lowerBound",
Value = lowerBound,
Direction = ParameterDirection.Output
};
SqlParameter upperBoundParam = new SqlParameter
{
ParameterName = "@upperBound",
Value = upperBound,
Direction = ParameterDirection.Output
};
command.Parameters.AddWithValue("@partnerId", Guid.Empty);
command.Parameters.Add(lowerBoundParam);
command.Parameters.Add(upperBoundParam);
connection.Open();
object result = command.ExecuteScalar();
//or object result = command.ExecuteNonQuery();
lowerBound = lowerBoundParam.Value as int? ?? -1;
lowerBound = lowerBoundParam.Value as int? ?? -1;
}
}
答案 0 :(得分:4)
ExecuteNonQuery
是更好的解决方案。另外两个用于返回行集的命令。
详细说明:
ExecuteReader
适用于您希望迭代命令返回的一组行的情况。
ExecuteScalar
适用于您希望接收返回的第一行的第一列的情况。它会自动丢弃所有其他行数据。
ExecuteNonQuery
适用于不直接返回行集的命令。
它们在具有Output,InputOutput或ReturnValue方向的参数方面具有相同的能力。唯一的区别是它们如何处理行集。