使用存储过程从查询中获取结果

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了使用存储过程从查询中获取结果相关的知识,希望对你有一定的参考价值。

我的程序包含行的网格视图,我想检查它们是否已经开帐单。

我这样做是通过检查存储项目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会返回受影响的行数量?为什么这不适合我的情况?

答案

你需要的是ExecuteScalar方法,当我们只有一行返回一列时使用,或者如果我们有多行,那么它也只选择第一行的第一列。

所以你可以这样做:

int amount = Convert.ToInt32(command.ExecuteScalar());

如果您需要行数,那么您可以在存储过程中使用Count()并且c#代码将保持不变,只需将您的查询修改为:

SELECT Count([items].[dbo].[itemLine].itemID)
.............
.............

现在您将拥有查询返回的总行数:

int count = Convert.ToInt32(command.ExecuteScalar());

以上是关于使用存储过程从查询中获取结果的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Codeigniter 中从模型获取查询结果到控制器

从 SQL Server 存储过程中获取结果

MySQL 存储过程,获取使用游标查询的结果集

MySQL ODBC 存储过程结果缺少列

如何从实体框架中的存储过程中获取结果+数据库优先

如何将存储过程查询结果输出到文本文件