2017-01-23 1 views
0

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

+0

Vous ne ExecuteScalar le faire? Pour votre information – Bauss

+0

'DbType.Int16' est un' '@ smallint' mais Inc_ID' est un' int', utilisez 'SqlDbType.Int' –

+0

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/ –

Répondre

1

Retirez ce code

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

et modifier vos codes comme celui-ci

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

Merci pour la réponse rapide de votre suggestion travaillé. Passons maintenant à un autre problème en obtenant une erreur sur l'analyse de la date – Perry

1

Vous fournissez un paramètre appelé « ID » qui n'est pas nécessaire par la procédure:

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

renommez ce paramètre à "@Inc_ID":

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

Vous n'avez pas besoin de fournir une valeur pour le paramètre, et indiquer qu'il est un paramètre de sortie. Au lieu de:

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

Utilisation:

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