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非常感谢您的回答。我希望我能把你的答案和合格的技术人员的答案都记下来……非常感谢你的回答。我希望我能标记为你的答案和合格的技术人员的答案。。。