Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/python-3.x/15.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用存储过程从查询中获取结果_C#_Sql Server_Stored Procedures - Fatal编程技术网

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

C# 使用存储过程从查询中获取结果,c#,sql-server,stored-procedures,C#,Sql Server,Stored Procedures,我的程序包含一个gridview行,我想检查这些行是否已经计费 我通过检查存储项目ID的列来实现这一点 我有以下存储过程: ALTER PROCEDURE [dbo].[getBilledItem] @itemID int AS BEGIN SET NOCOUNT ON; SELECT [items].[dbo].[itemLine].itemID FROM [items].[dbo].[itemLine] WHERE description LIK

我的程序包含一个gridview行,我想检查这些行是否已经计费

我通过检查存储项目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行时添加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
会返回受影响行的数量?为什么这对我的案子不起作用

您需要的是当我们只有一行返回一列时使用的方法,或者如果在这种情况下我们也有多行,它将只选择第一行的第一列

因此,您可以:

int amount = Convert.ToInt32(command.ExecuteScalar());
如果需要行数,则可以在存储过程中使用,并且c代码将保持不变,只需将查询修改为:

SELECT Count([items].[dbo].[itemLine].itemID)
.............
.............
现在您将获得查询返回的总行数:

int count = Convert.ToInt32(command.ExecuteScalar());
您需要的是当我们只有一行返回一列时使用的方法,或者如果在这种情况下也有多行,它将只选择第一行的第一列

因此,您可以:

int amount = Convert.ToInt32(command.ExecuteScalar());
如果需要行数,则可以在存储过程中使用,并且c代码将保持不变,只需将查询修改为:

SELECT Count([items].[dbo].[itemLine].itemID)
.............
.............
现在您将获得查询返回的总行数:

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

如果在过程中设置了
无计数
,则过程根本不会将行计数传回应用程序。感谢@TabAlleman的回复,但设置行计数效果不佳,您的问题自相矛盾。您是在查找受影响行的数量,还是在查找itemID?它们不一样。假设select查询始终返回最多1行(如果满足条件)是:“对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。”非SELECT语句。如果在过程中设置了
无计数
,则过程根本不会将行计数传递回应用程序。感谢@TabAlleman的回复,但设置它并不奏效,您的问题自相矛盾。您是在查找受影响行的数量,还是在查找itemID?它们不一样。假设select查询始终返回最多1行(如果满足条件)是:“对于UPDATE、INSERT和DELETE语句,返回值是受命令影响的行数。”而不是select语句。