簡體   English   中英

為什么C#代碼沒有從存儲過程中返回值

[英]Why is The C# code not returning a value from Stored Procedure

我試圖使用如下所示的存儲過程從數據庫中提取一條數據。

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

我得到一個空字符串。 為什么這不起作用?

您忘記告訴命令您要執行存儲過程:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM