代码之家  ›  专栏  ›  技术社区  ›  julian bechtold

如何修复存储过程需要返回参数,而该参数不是在C中提供的?

  •  0
  • julian bechtold  · 技术社区  · 6 年前

    我有一个名为“sp_AddDevice”的存储过程,它接受以下变量:

    @DeviceID AS NVARCHAR(8),
    @Device_location AS NVARCHAR(40),
    @Device_asset AS NVARCHAR(7),
    @Device_name AS NVARCHAR(50),
    @Device_manuf AS NVARCHAR(25),
    @Device_model AS NVARCHAR(20),
    @Device_serial AS NVARCHAR(40),
    @Device_other AS NVARCHAR(20),
    @Device_status AS SMALLINT,
    @Device_type AS SMALLINT,
    @EnteredBy AS VARCHAR(50),
    @ChangedBy AS VARCHAR(50),
    @errStatusOK INT OUTPUT
    

    困扰我的是变量'@errStatusOK INT OUTPUT'

    我这样调用存储过程,但收到的错误消息是未提供变量“@errStatusOK”:

    SqlCommand command = new SqlCommand(@"BCS_Verify.dbo.sp_AddDevice", con);
    command.CommandType = CommandType.StoredProcedure;
    command.Parameters.Add("@DeviceID", SqlDbType.NVarChar, 8).Value = deviceID;
    command.Parameters.Add("@Device_location", SqlDbType.NVarChar, 40).Value = location;
    command.Parameters.Add("@Device_asset", SqlDbType.NVarChar, 7).Value = deviceID.ToLower().TrimStart('b','c','s');
    command.Parameters.Add("@Device_name", SqlDbType.NVarChar, 50).Value = type;
    command.Parameters.Add("@Device_manuf", SqlDbType.NVarChar, 25).Value = brand;
    command.Parameters.Add("@Device_model", SqlDbType.NVarChar, 20).Value = model;
    command.Parameters.Add("@Device_serial", SqlDbType.NVarChar, 40).Value = serial;
    command.Parameters.Add("@Device_other", SqlDbType.NVarChar, 20).Value = "N/A";
    command.Parameters.Add("@Device_status", SqlDbType.SmallInt).Value = status;
    command.Parameters.Add("@Device_type", SqlDbType.SmallInt).Value = 0;
    command.Parameters.Add("@EnteredBy", SqlDbType.NVarChar, 50).Value = GlobalVar.Default.Username;
    command.Parameters.Add("@ChangedBy", SqlDbType.NVarChar, 50).Value = GlobalVar.Default.Username;
    var returnParameter = command.Parameters.Add("@errStatusOK", SqlDbType.Int);
    returnParameter.Direction = ParameterDirection.ReturnValue;
    command.ExecuteNonQuery();
    if (returnParameter.SqlValue.ToString() == "1") return true;
    else return false;
    

    enter image description here

    我是否必须以不同的方式定义返回变量,或者可能存在什么问题?

    3 回复  |  直到 6 年前
        1
  •  0
  •   Chris Catignani Sagar Barapatre    6 年前

    我用的是这样的:

    command.Parameters.Add("@errStatusOK", SqlDbType.Int).Direction =
    ParameterDirection.Output;
    

    command.ExecuteNonQuery(); 
    int iRetVal = Convert.ToInt32(commad.Parameters["@errStatusOK"].Value);
    
        2
  •  0
  •   Tamás Kecskeméti    6 年前

    试试这个,也许把参数方向从结果改为输出就足够了:

    SqlParameter errStatusOK = new SqlParameter
                {
                    ParameterName = "@errStatusOK",
                    IsNullable = false,
                    Direction = ParameterDirection.Output,
                    SqlDbType = SqlDbType.Int,
                    Value = 0,
                };
         command.Parameters.Add(errStatusOK);
         command.ExecuteNonQuery(); 
         int returnValue = (int)commad.Parameters["@errStatusOK"].Value;