2011-11-27 57 views
1

我在调用应该删除记录的存储过程。在删除之前,如果在另一个表中有涉及我们要删除的记录的记录,则执行检查。如果是的话,我需要返回一个文本值列表来识别引用我们想要删除的记录的记录,所以用户可以先删除它们。我想我应该使用这个输出参数,但不知道如何分配一个记录集。这里是我的代码:如何将记录集作为输出参数返回?

  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(); 

我不确定我的resultParameter是否正确。 这里是存储过程的一部分:

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是什么类型。

你能帮我写正确的方法吗? 谢谢, 大卫

回答

3

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

你有三种选择:

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

SELECT TOP 1 @pResult = Название FROM Город WHERE ТД = '@pID'; 

在这种情况下,@pResult应该是大小的大小。

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

SELECT @pResult = CASE WHEN @pResult <> '' THEN ', ' ELSE '' END + Название FROM Город WHERE ТД = '@pID'; 

这将返回一个以逗号分隔的列表。在这种情况下,如果数据库支持它或NVARCHAR(8000),那么@pResult应该是NVARCHAR(MAX)。无论哪种情况,您都应该考虑将此声明限制在前n个(比如10个匹配项)。

3)使用标准选择语句将所有值返回给用户。

SELECT Название FROM Город WHERE ТД = '@pID'; 

在这种情况下,您的代码必须使用ExecuteReader而不是ExecuteNonQuery,并且不需要@pResult。

作为用@pResult一起工作的正确方法:

对于前两个选项,改变下面的行:

rdr = cmd.ExecuteReader(); 

到:

cmd.ExecuteNonQuery(); 

string sError; 
if (resultParameter.Value != DBNull.Value) { 
    sError = resultParameter.Value.ToString(); 

if (!string.IsNullOrEmpty(sError) { 
    // Report the error to the user. 

在第三种情况,您将完全删除参数代码并仅处理读取器输出(粗略代码如下):

rdr = cmd.ExecuteReader(); 

StringBuilder sbResult = new StringBuilder(500); 

do while rdr.Read() { 
    if (sbResult.Length != 0) { 
     sbResult.Append(", "); 
    } 
    sbResult.Append(rdr[0].ToString()); 
} 
+0

非常感谢您的完整答案。它现在有效。 –

3

我会考虑摆脱@pResult。

将其更改为声明...

如果计数> 0 从那里= @pId

其他 做删除 返回NULL

然后完成代码中的无效支票其他表选择IDS ..否则,你会有到绑定@pId

保重记录列表,

的Brynn

+0

非常感谢您的回答。我希望我可以将您的答案和competent_tech标记为... –