如何将记录集作为输出参数返回
本文关键字:输出 参数 返回 记录 | 更新日期: 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