Je cette procédure stockée SQL Server qui fournit une valeur de sortie. Notez que la valeur de sortie est la graine d'identité qui est créée lorsque le nouvel enregistrement est ajouté.Comment appeler une procédure stockée avec une sortie en utilisant 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
J'utilise ce code C# pour appeler cette procédure avec les paramètres nécessaires et aimeraient obtenir l'entier de sortie arrière.
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();
}
Le code construit mais quand je le lance, je reçois ce message d'erreur lorsque l'exécution de la procédure stockée est appelée
{ "procédure ou la fonction « ocso_InsertIncident » attend à ce que le paramètre « @Inc_ID », qui n'a pas été fourni. "}
J'ai donc essayé passer une valeur nulle pour la @INC_ID paramter en incluant ce dans le code
_Incident.Parameters.AddWithValue("@INC_ID", DBNull.Value);
mais je puis obtenir l'erreur un message { « Procédure ou ocso_InsertIncident fonction a trop d'arguments spécifiés. »}
me semble être coincé quelqu'un peut aider s'il vous plaît
Merci
Vous ne ExecuteScalar le faire? Pour votre information – Bauss
'DbType.Int16' est un' '@ smallint' mais Inc_ID' est un' int', utilisez 'SqlDbType.Int' –
Vous devriez vraiment utiliser SCOPE_IDENTITY ici à la place. S'il y a un déclencheur sur cette table qui fait un insert avec une identité, vous obtiendrez cette valeur à la place de celle de la table dans laquelle vous insérez. https://blog.sqlauthority.com/2007/03/25/sql-server-identity-vs-scope_identity-vs-ident_current-retrieve-last-inserted-identity-of-record/ –