为什么我不能处理存储过程的返回值是c#?

问题描述:

我在C#中是新的,并希望写与SQL Server存储过程的简单应用工作,在SQL Server写这个存储过程:
为什么我不能处理存储过程的返回值是c#?

USE [mammutRecruitment] 
ALTER PROCEDURE [dbo].[FirstStep] 
    @Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
    @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
AS 
BEGIN 
    DECLARE @MYID bigint 
    insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode, 
    @Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1) 

     select @MYID=[UserID] from [mammutRecruitment].[dbo].[UserMainSpecifications] 
     where [NationalCode][email protected] 
     select @MYID as myID 

END 


和C#编写代码的调用:

using (SqlConnection con = new SqlConnection("Data Source=.;Initial Catalog=mammutRecruitment;Integrated Security=True")) 
      { 
       using (SqlCommand cmd = new SqlCommand("FirstStep", con)) 
       { 
        cmd.CommandType = CommandType.StoredProcedure; 
        cmd.Parameters.Add("@Name", SqlDbType.NVarChar).Value = m.Name; 
        cmd.Parameters.Add("@Family", SqlDbType.NVarChar).Value = m.Family; 
        cmd.Parameters.Add("@FatherName", SqlDbType.NVarChar).Value = m.FatherName; 
        cmd.Parameters.Add("@BirthCertificate", SqlDbType.BigInt).Value =Convert.ToInt64(m.BirthCertificate); 
        cmd.Parameters.Add("@PlaceOfBirth", SqlDbType.NVarChar).Value = m.PlaceOfBirth; 
        cmd.Parameters.Add("@BirthDate", SqlDbType.DateTime).Value =Convert.ToDateTime(dt.ToString()); 
        cmd.Parameters.Add("@NationalCode", SqlDbType.BigInt).Value =Convert.ToInt64(m.NationalCode); 
        cmd.Parameters.Add("@Religion", SqlDbType.NVarChar).Value = m.Religion; 
        cmd.Parameters.Add("@faith", SqlDbType.NVarChar).Value = m.faith; 
        cmd.Parameters.Add("@Nationality", SqlDbType.NVarChar).Value = m.Nationality; 
        cmd.Parameters.Add("@BloodGroup", SqlDbType.NVarChar).Value = m.BloodGroup; 
        SqlParameter retval = cmd.Parameters.Add("@myID", SqlDbType.BigInt); 
        retval.Direction = ParameterDirection.ReturnValue; 
        con.Open(); 
        cmd.ExecuteNonQuery(); 
        var retunvalue = cmd.Parameters["@myID"].Value; 


但在此行中我得到零值始终:

var retunvalue = cmd.Parameters["@myID"].Value; 


发生了什么?我该如何解决这个问题?谢谢。

+0

您还没有返回值,你只是选择它。请将您的proc更改为'RETURN @ MyID'或将代码更改为'var returnvalue = cmd.ExecuteScalar()'。 – Siyual

+0

您在C#代码中添加参数,但在存储过程的输入参数之间没有该参数。 – Steve

+0

或者使用ExecuteScalar来获取查询返回的单个值,或者使该参数成为输出参数,并以此方式获取其值。 – ADyson

这条线:

cmd.ExecuteNonQuery(); 

正在执行查询并没有返回值。

cmd.ExecuteReader(); 

或者,如果你想在第一行的第一个字段的值,你可以这样做::

你可以通过观察用这个代替开始

var returnValue = cmd.ExecuteScalar(); 

哪样为您提供一个对象,然后您可以将其转换或转换为您的方法的适当类型。

+0

感谢我的朋友,我6分钟后接受 –

您需要在您的存储过程定义,包括@myID作为输出参数:

ALTER PROCEDURE [dbo].[FirstStep] 
    @Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
    @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
    , @myID bigint output 
AS 

然后取出线

DECLARE @MYID bigint 

您还需要添加到CMD参数的C#代码:

cmd.Parameters.Add(retval); 

SqlCommand.ExecuteNonQuery Method()

对连接执行Transact-SQL语句并返回 受影响的行数。

SqlCommand.ExecuteScalar Method()

执行查询,并在 返回第一行的第一列由查询返回的结果集。其他列或行是 忽略。

我相信你想要的第二种方法

其实,你需要更改声明:

retval.Direction = ParameterDirection.ReturnValue;

retval.Direction = ParameterDirection.Output

因为的ExecuteNonQuery回报:

执行对连接的Transact-SQL语句并返回th e受影响的行数。 虽然ExecuteNonQuery不返回任何行,但映射到参数的任何输出参数或返回值都会填充数据。

末包括你的参数过程定义: @myID BIGINT OUTPUT

USE [mammutRecruitment] 

ALTER PROCEDURE [dbo].[Firststep] @Name    NVARCHAR(max), 
           @Family   NVARCHAR(max), 
           @FatherName  NVARCHAR(max), 
           @BirthCertificate BIGINT, 
           @PlaceOfBirth  NVARCHAR(max), 
           @BirthDate  DATETIME, 
           @NationalCode  BIGINT, 
           @Religion   NVARCHAR(max), 
           @faith   NVARCHAR(max), 
           @Nationality  NVARCHAR(max), 
           @BloodGroup  NVARCHAR(max), 
           @myID    BIGINT output 
AS 
    BEGIN 

    INSERT INTO [dbo].[usermainspecifications] 
    VALUES  (@Name, 
       @Family, 
       @FatherName, 
       @BirthCertificate, 
       @PlaceOfBirth, 
       1, 
       @BirthDate, 
       @NationalCode, 
       @Religion, 
       @faith, 
       @Nationality, 
       @BloodGroup, 
       12, 
       '123', 
       '123', 
       1, 
       2015 - 1 - 1, 
       '12', 
       '123', 
       '1234', 
       1) 

    SELECT @myID = [userid] 
    FROM [mammutRecruitment].[dbo].[usermainspecifications] 
    WHERE [nationalcode] = @NationalCode 
END 

你需要定义@MYID作为输出参数。

USE [mammutRecruitment] 
    ALTER PROCEDURE [dbo].[FirstStep] 
     @MYID bigint output,@Name nvarchar(max),@Family nvarchar(max),@FatherName nvarchar(max),@BirthCertificate bigint,@PlaceOfBirth nvarchar(max),@BirthDate datetime, 
     @NationalCode bigint,@Religion nvarchar(max),@faith nvarchar(max),@Nationality nvarchar(max),@BloodGroup nvarchar(max) 
    AS 
    BEGIN 

     insert into [dbo].[UserMainSpecifications] values(@Name,@Family,@FatherName,@BirthCertificate,@PlaceOfBirth,1,@BirthDate,@NationalCode, 
     @Religion,@faith,@Nationality,@BloodGroup,12,'123','123',1,2015-1-1,'12','123','1234',1) 

      select @MYID = SCOPE_IDENTITY() 

    END 

,并添加你的命令

SqlParameter pOut = new SqlParameter("@MYID", SqlDbType.BigInt); 
pOut.Direction = ParameterDirection.Output; 
cmd.Parameters.Add(pOut); 

可以读取值现在

cmd.ExecuteNonQuery(); 
long newId = (long)pOut.Value;