我有這個提供輸出值的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已指定的參數太多。」}
我似乎有人可以幫忙請
感謝
不能的ExecuteScalar做呢? – Bauss
僅供參考'DbType.Int16'用於'smallint',但'@ Inc_ID'是'int',使用'SqlDbType.Int' –
您確實應該在這裏使用SCOPE_IDENTITY。如果在該表上有觸發器執行帶有身份的插入,則將獲取該值而不是要插入的表中的值。 https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ –