【问题标题】:How To Call a Stored Procedure with an Output using C#如何使用 C# 调用带有输出的存储过程
【发布时间】:2017-01-23 22:57:55
【问题描述】:

我有这个提供输出值的 SQL Server 存储过程。请注意,输出值是添加新记录时创建的身份种子。

    @EventNumber varchar(12),
    @inc_date_occurred varchar(10),
    @inc_time_occurred int,
    @inc_location varchar (200),
    @inc_location_exempt bit,
    @inc_case_number varchar(9),
    @Zone varchar(50),
    @inc_school_name varchar(50),
    @inc_special_detail_name varchar(50),
    @Inc_ID int output
AS
BEGIN
    IF @EventNumber IS NOT NULL
       --Start Building a Record that comes in with an Event Number
       INSERT INTO Tbl_Incident(inc_event_number, inc_is_uof, inc_is_comp_via_sup,
                                inc_is_comp_via_psd, inc_date_recvd, inc_date_occurred_start,
                                inc_time_occurred_start, inc_location, inc_location_exempt,
                                inc_case_number, inc_status, inc_comp_complaint_to_psd,
                                inc_synopsis, inc_zone, inc_school_name,
                                inc_special_detail_name, inc_arrest_made, 
                                inc_date_entered, inc_entered_by)

      VALUES (@EventNumber, '1', --inc_is_uof,
              '0', --inc_is_comp_via_sup
              '0', --inc_is_comp_via_sup
              GETDATE(),--inc_date-received,
              CAST(@inc_date_occurred AS DATE),--inc_date_occurred
              --start time conversion
              right(convert(varchar(20), cast(stuff(right('0000' + convert(varchar(4),@inc_time_occurred),4),3,0,':') as datetime),100),7),
              -- end time converted from Military to standard
              @inc_location, @inc_location_exempt, @inc_case_number,
              'OPEN',--@inc_status,
              '0', --
              'This is a for REVIEW ONLY',--synopsis,
              @Zone, @inc_school_name, @inc_special_detail_name,
              '0', --@inc_arrest_made
              GETDATE(), --inc_date_entered
              'SharePoint Transfer'--@inc_entered_by
              )

    SET @Inc_ID = @@IDENTITY

我正在使用此 C# 代码使用必要的参数调用此过程,并希望取回输出整数。

using (SqlCommand _Incident = new SqlCommand("ocso_InsertIncident", _con))
{
    _Incident.CommandType = CommandType.StoredProcedure;

    // set up parameters
    _Incident.Parameters.AddWithValue("@EventNumber", EventNumber);
    _Incident.Parameters.AddWithValue(@"inc_Date_Occurred", DateTime.Parse("01-10-2017"));
    _Incident.Parameters.AddWithValue("@inc_Time_Occurred", "1535");
    _Incident.Parameters.AddWithValue("@inc_Location", "Web Service Entry");
    _Incident.Parameters.AddWithValue("@inc_location_exempt", 0);
    _Incident.Parameters.AddWithValue("@inc_Case_Number", "2107-123456");
    _Incident.Parameters.AddWithValue("@Zone", "34");
    _Incident.Parameters.AddWithValue("@inc_school_name", DBNull.Value);
    _Incident.Parameters.AddWithValue("@inc_special_detail_name", DBNull.Value);

    // Output value
    SqlParameter inc_ID = new SqlParameter("@ID", DbType.Int16);
    inc_ID.Direction = System.Data.ParameterDirection.Output;
    _Incident.Parameters.Add(inc_ID);

    _Incident.ExecuteNonQuery();

    string inc_id = _cmd.Parameters["@ID"].Value.ToString();
}

代码会构建,但是当我运行它时,在调用存储过程的执行时收到此错误消息

{"过程或函数 'ocso_InsertIncident' 需要参数 '@Inc_ID',但未提供。"}

所以我尝试通过将其包含在代码中来为 @INC_ID 参数传递一个空值

_Incident.Parameters.AddWithValue("@INC_ID", DBNull.Value);

但我随后收到错误消息 {“过程或函数 ocso_InsertIncident 指定了太多参数。”}

我好像被卡住了,请有人帮忙

谢谢

【问题讨论】:

  • 不能用 ExecuteScalar 做吗?
  • 仅供参考,DbType.Int16smallint,但 @Inc_IDint,请使用 SqlDbType.Int
  • 你真的应该在这里使用 SCOPE_IDENTITY 。如果该表上有一个触发器使用标识进行插入,您将获得该值,而不是您要插入的表中的值。 blog.sqlauthority.com/2007/03/25/…

标签: c# sql-server stored-procedures


【解决方案1】:

删除此代码

_Incident.Parameters.AddWithValue("@INC_ID", DBNull.Value);

并像这样修改您的代码

SqlParameter inc_ID = new SqlParameter("@INC_ID", DbType.Int16);
                    inc_ID.Direction = System.Data.ParameterDirection.Output;
                    _Incident.Parameters.Add(inc_ID);
                    _Incident.ExecuteNonQuery();

                    string inc_id = _cmd.Parameters["@INC_ID"].Value.ToString();

【讨论】:

  • 感谢您的建议有效的快速响应。现在转到另一个问题,在解析日期时出错
【解决方案2】:

您不需要为参数提供值,并且应该指出它是一个输出参数。而不是:

_Incident.Parameters.AddWithValue("@INC_ID", DBNull.Value);

用途:

SqlParameter outputValue = new SqlParameter("@INC_ID", SqlDbType.Int);
outputValue.Direction = ParameterDirection.Output;
cmd.Parameters.Add(outputValue);

【讨论】:

    【解决方案3】:

    您提供了一个过程不需要的名为“ID”的参数:

    SqlParameter inc_ID = new SqlParameter("@ID", DbType.Int16);
    inc_ID.Direction = System.Data.ParameterDirection.Output;
    _Incident.Parameters.Add(inc_ID);
    

    尝试将此参数重命名为“@Inc_ID”:

    SqlParameter inc_ID = new SqlParameter("@Inc_ID", DbType.Int16);
    inc_ID.Direction = System.Data.ParameterDirection.Output;
    _Incident.Parameters.Add(inc_ID);
    

    【讨论】:

      猜你喜欢
      • 2018-04-29
      • 2023-03-25
      • 1970-01-01
      • 2018-03-09
      • 1970-01-01
      • 1970-01-01
      • 2016-12-26
      • 2011-09-18
      • 1970-01-01
      相关资源
      最近更新 更多