C# 如何将记录集作为输出参数返回?

C# 如何将记录集作为输出参数返回?,c#,tsql,ado.net,C#,Tsql,Ado.net,我正在调用一个应该删除记录的存储过程。删除前,将检查另一个表中是否有任何记录引用了要删除的记录。如果是,我需要返回一个文本值列表,该列表将标识引用我们要删除的记录的记录,以便用户可以首先删除它们。我想我应该为此使用一个输出参数,但不确定如何为其分配记录集。这是我的密码: SqlCommand cmd = new SqlCommand("DeleteTD", conn); cmd.CommandType = CommandType.StoredPr

我正在调用一个应该删除记录的存储过程。删除前,将检查另一个表中是否有任何记录引用了要删除的记录。如果是,我需要返回一个文本值列表,该列表将标识引用我们要删除的记录的记录,以便用户可以首先删除它们。我想我应该为此使用一个输出参数,但不确定如何为其分配记录集。这是我的密码:

            SqlCommand cmd = new SqlCommand("DeleteTD", conn);

            cmd.CommandType = CommandType.StoredProcedure;

            cmd.Parameters.Add(new SqlParameter("@pID", gvTD.SelectedDataKey));
            SqlParameter resultParameter = cmd.Parameters.Add(new SqlParameter("@pResult", SqlDbType.NVarChar));
            resultParameter.Direction = ParameterDirection.Output;
            rdr = cmd.ExecuteReader();
我不确定我的结果参数是否正确。 以下是存储过程的一部分:

CREATE PROCEDURE DeleteTD
    -- Add the parameters for the stored procedure here
    @pID INT, 
    @pResult NVARCHAR(100) OUTPUT
AS
BEGIN
    -- SET NOCOUNT ON added to prevent extra result sets from
    -- interfering with SELECT statements.
    SET NOCOUNT ON;

    -- Insert statements for procedure here

    DECLARE @vCount INT;

    SELECT @pResult = 0;
    SELECT @vCount = COUNT(1) FROM Город WHERE Город.ТД = '@pID';

    IF @vCount > 0
        SELECT @pResult = Название FROM Город WHERE ТД = '@pID';
    ELSE
        DELETE FROM ТД WHERE ID = @pID;
同样,我不确定@pResult应该有什么类型

你能帮我用正确的方法写代码吗? 谢谢
David

目前SP的问题是,您只会得到一个返回值,而不是一个值列表

你有三个选择:

1) 向用户返回1个值,指示出现问题的第一条记录。这是最容易实现的

 SELECT TOP 1 @pResult = Название FROM Город WHERE ТД = '@pID';
在这种情况下,@pResult的大小应为

2) 将指示参数中问题的完整列表的所有值返回给用户。如果值太多,这将成为SQL和用户的问题

 SELECT @pResult = CASE WHEN @pResult <> '' THEN ', ' ELSE '' END + Название FROM Город WHERE ТД = '@pID';
在这种情况下,您的代码必须是ExecuteReader而不是ExecuteOnQuery,并且不需要@pResult

关于使用@pResult的正确方法:

对于前两个选项,请更改以下行:

rdr = cmd.ExecuteReader();
致:

在第三种情况下,您将完全消除参数代码,只处理读取器输出(大致代码如下):


SP目前的问题是,您只能获得一个返回值,而不是一个值列表

你有三个选择:

1) 向用户返回1个值,指示出现问题的第一条记录。这是最容易实现的

 SELECT TOP 1 @pResult = Название FROM Город WHERE ТД = '@pID';
在这种情况下,@pResult的大小应为

2) 将指示参数中问题的完整列表的所有值返回给用户。如果值太多,这将成为SQL和用户的问题

 SELECT @pResult = CASE WHEN @pResult <> '' THEN ', ' ELSE '' END + Название FROM Город WHERE ТД = '@pID';
在这种情况下,您的代码必须是ExecuteReader而不是ExecuteOnQuery,并且不需要@pResult

关于使用@pResult的正确方法:

对于前两个选项,请更改以下行:

rdr = cmd.ExecuteReader();
致:

在第三种情况下,您将完全消除参数代码,只处理读取器输出(大致代码如下):


我会考虑去除“PROTUT”。< /P> 把它改成一句话

如果计数>0 从另一个表中选择ID,其中ID=@pId

否则 执行删除操作 返回空值

然后在代码中完成null检查。。否则,您将拥有绑定到@pId的记录列表

保重,


Brynn:

< P>我会考虑去除“PROTUT”。< /P> 把它改成一句话

如果计数>0 从另一个表中选择ID,其中ID=@pId

否则 执行删除操作 返回空值

然后在代码中完成null检查。。否则,您将拥有绑定到@pId的记录列表

保重,


Brynn

非常感谢您的回答。我希望我能把你的答案和合格的技术人员的答案都记下来……非常感谢你的回答。我希望我能标记为你的答案和合格的技术人员的答案。。。