2017-01-23 55 views
0

我有這個提供輸出值的SQL Server存儲過程。請注意,輸出值是添加新記錄時創建的標識種子。如何使用C調用一個輸出調用存儲過程

@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',[email protected]_status, 
       '0', -- 
       'This is a for REVIEW ONLY',--synopsis, 
       @Zone, @inc_school_name, @inc_special_detail_name, 
       '0', [email protected]_arrest_made 
       GETDATE(), --inc_date_entered 
       'SharePoint Transfer'[email protected]_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’,這未提供。「}

所以,我想通過包括本代碼

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

傳遞的@INC_ID放慢參數爲空值,但後來我得到的錯誤被卡住消息{「過程或函數ocso_InsertIncident已指定的參數太多。」}

我似乎有人可以幫忙請

感謝

+0

不能的ExecuteScalar做呢? – Bauss

+0

僅供參考'DbType.Int16'用於'smallint',但'@ Inc_ID'是'int',使用'SqlDbType.Int' –

+0

您確實應該在這裏使用SCOPE_IDENTITY。如果在該表上有觸發器執行帶有身份的插入,則將獲取該值而不是要插入的表中的值。 https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ –

回答

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

感謝您快速回復您的建議工作。現在轉到解析日期時出現錯誤的另一個問題 – Perry

1

您提供一個名爲不需要「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); 
1

你並不需要提供的參數值的代碼,並應說明它是一個輸出參數。相反的:

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

用途:

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