2011-11-27 3 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(); 

Я не уверен, что мой результатПараметр правильный. Вот часть хранимой процедуры:

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

ответ

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'; 

Это вернет список с разделителями-запятыми. В этом случае @pResult должен быть NVARCHAR (MAX), если ваша БД поддерживает его или NVARCHAR (8000). В любом случае вам следует подумать о том, чтобы ограничить это утверждение до верхнего n (например, 10 совпадений).

3) Возврат всех значений пользователю с помощью стандартного оператора select.

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

еще сделать удаления возвращения нуля

затем выполнить проверку на нуль в коде .. В противном случае вы есть список записей, которые привязаны к @pId

Заботиться,

Brynn

+0

Большое спасибо за ваш ответ. Мне жаль, что я не могу отметить как ответ как ваш, так и компетентный_tech's ... –

Смежные вопросы