我的程序包含一系列行的网格视图,我想检查它们是否已经开帐单。
我通过检查存储项目ID的列来完成此操作。
我有以下存储过程:
ALTER PROCEDURE [dbo].[getBilledItem]
@itemID int
AS
BEGIN
SET NOCOUNT ON;
SELECT [items].[dbo].[itemLine].itemID
FROM [items].[dbo].[itemLine]
WHERE description LIKE '%' + cast(@itemID AS VARCHAR(255)) + '%'
END
我想在我的程序中做的是在存储过程返回1 row(s) affected
时添加itemID,但这不起作用。
我的代码如下:
using (var conn = new SqlConnection(System.Configuration.ConfigurationManager.ConnectionStrings["Database"].ConnectionString))
using (var command = new SqlCommand("getBilledItem", conn)
{
CommandType = CommandType.StoredProcedure
})
{
command.Parameters.Add(new SqlParameter("@itemID", SqlDbType.Int)).Value = itemID;
conn.Open();
int amount = command.ExecuteNonQuery();
if (amount > 0)
{
AlreadyBilledIDs.Add(itemID.ToString());
}
}
即使我的存储过程确实返回一行,我的程序也无法捕获它。
我的代码是什么,我做错了?我以为CommandExecuteNonQuery
会返回受影响的行数量?为什么这不适用于我的情况?
答案 0 :(得分:2)
你需要的是ExecuteScalar
方法,当我们只有一行返回一列时使用,或者如果我们在这种情况下有多行,它只会选择第一行的第一列。
所以你可以这样做:
int amount = Convert.ToInt32(command.ExecuteScalar());
如果您需要行数,那么您可以在存储过程中使用Count()
,并且c#代码将保持不变,只需将您的查询修改为:
SELECT Count([items].[dbo].[itemLine].itemID)
.............
.............
现在您将拥有查询返回的总行数:
int count = Convert.ToInt32(command.ExecuteScalar());