2017-01-19 3 views
1

Я пытаюсь извлечь одну часть данных из моей базы данных, используя хранимую процедуру, которая выглядит так.Почему код C# не возвращает значение из хранимой процедуры

USE [PSD] 
GO 
/****** Object: StoredProcedure [dbo].[ocso_GetNextDTEventNumber] Script Date: 1/19/2017 10:12:19 AM ******/ 
SET ANSI_NULLS ON 
GO 
    SET QUOTED_IDENTIFIER ON 
GO 

ALTER PROCEDURE [dbo].[ocso_GetNextDTEventNumber] 
    @EventNumber varchar(15) OUTPUT 
AS 
BEGIN 
-- SET NOCOUNT ON added to prevent extra result sets from 
-- interfering with SELECT statements. 
SET NOCOUNT ON; 

--increment last number by 1 
UPDATE LU_EVENT_NUMBERS SET evn_last_number = evn_last_number + 1 where evn_year = Year(GetDate()) 
--return event number to caller 

    --Get the next event number for all incidents 
SELECT @EventNumber = evn_comp_formatted_next_num from LU_EVENT_NUMBERS where evn_year = Year(GetDate()) 

END 

Я проверить эту процедуру, используя этот код SQL

DECLARE @NewEventNumber varchar(15) 
Execute dbo.ocso_GetNextDTEventNumber 
@EventNumber = @NewEventNumber OUTPUT; 
Print convert(varchar(15),@NewEventNumber) 

И я получаю результаты, которые я бы ожидать. Теперь, когда я пытаюсь получить результаты в моих C# код, который выглядит следующим образом:

public string GetEventNumber(string enumber) 
     { 
      string results; 

      SqlConnection _con = new SqlConnection(); 
      _con.ConnectionString = 
       "Data Source=ops-devsql;" + 
       "Initial Catalog=PSD;" + 
       "User id=****;" + 
       "Password=****;"; 
      _con.Open(); 

      { 
       using (SqlCommand _cmd = new SqlCommand("ocso_GetNextDTEventNumber", _con)) 
       { 
        _cmd.Parameters.Add("@NewEventNumber", SqlDbType.VarChar, 15) 
            .Direction = ParameterDirection.Output; 
        _cmd.ExecuteNonQuery(); 

        results = _cmd.Parameters["@NewEventNumber"].Value.ToString(); 
        //results = (string)_cmd.Parameters["@NewEventNumber"].Value.ToString(); 
        return results; 
       } 
      } 
     } 

Я получаю пустую строку обратно. Почему это не работает?

+7

Ваш параметр является '@ EventNumber', а не' @ NewEventNumber' – Crowcoder

+2

'_cmd.CommandType = CommandType.StoredProcedure'? –

+0

Спасибо #Crowcoder, когда я изменил параметр на @EventNumber. Я получаю эту ошибку при запуске {«Процедура или функция« ocso_GetNextDTEventNumber »ожидает параметра« @EventNumber », который не был указан.»} – Perry

ответ

4

Вы забыли сказать команду, которую вы хотите выполнить хранимую-процедуры:

using (SqlCommand _cmd = new SqlCommand("ocso_GetNextDTEventNumber", _con)) 
{ 
    _cmd.CommandType = CommandType.StoredProcedure; 
    //... 
} 

Если вы не укажете его значение по умолчанию принимается, который Text (так простой запрос SQL). Я предполагаю, что у вас где-то пустое Try....Catch, потому что это должно вызвать исключение.

Вы также должны использовать то же имя параметра:

_cmd.Parameters.Add("@EventNumber", SqlDbType.VarChar, 15).Direction = ParameterDirection.Output; 
_cmd.ExecuteNonQuery(); 
results = _cmd.Parameters["@EventNumber"].Value.ToString(); 
+0

Большое вам спасибо, что была проблема – Perry