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

本文关键字:输出 参数 返回 记录 | 更新日期: 2023-09-27 18:15:45

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

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

你能帮我写我的代码正确的方式吗?谢谢,大卫。

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

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

你有三个选择:

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

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

在这种情况下,@pResult应该是Название的大小。

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

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

这将返回一个逗号分隔的列表。在这种情况下,@pResult应该是NVARCHAR(MAX),如果你的数据库支持它或NVARCHAR(8000)。无论哪种情况,您都应该考虑将此语句限制在前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());
}

我会考虑去掉@pResult。

把它改成…

if count> 0select id from other table where it = @pId

其他执行删除操作返回null

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

的记录列表。

照顾,

Brynn