Exécute une procédure stockée N fois dans c #

J'ai une procédure stockée appelée "VehicleCamp", cette procédure stockée insert des données à cette table:

+---------------------+-----+-------------+--------------+-----------+-----------------+ | id_campaing_control | vin | campaing_id | id_workorder | id_client | campaing_status | +---------------------+-----+-------------+--------------+-----------+-----------------+ | | | | | | | +---------------------+-----+-------------+--------------+-----------+-----------------+ | | | | | | | +---------------------+-----+-------------+--------------+-----------+-----------------+ 

C'est le code d'une procédure stockée:

 CREATE PROCEDURE VehicleCamp( @vin VARCHAR(100), @id_camp int, @workorder varchar (100), @id_client int, @status varchar(64) ) AS BEGIN SET NOCOUNT ON; IF(@id_client IS NULL) BEGIN INSERT INTO vehicle_campaing (vin,campaing_id,id_workorder,campaing_status) values( @vin, @id_camp, @workorder, @status); END ELSE BEGIN INSERT INTO vehicle_campaing (vin,campaing_id,id_workorder,id_client,campaing_status) values( @vin, @id_camp, @workorder, @id_client, @status); END END 

J'ai besoin d'exécuter cette procédure stockée en C #, en fonction du nombre de véhicules, les véhicules peuvent être N nombre de véhicules.

Je garde les numéros VIN des véhicules dans une ArrayList, mais je ne sais pas comment exécuter la procédure stockée N fois et comment assigner le paramètre @vin à chaque élément dans ArrayList.

C'est mon code C #:

 public void insertVinCamp() { ssortingng connetionSsortingng = null; connetionSsortingng = "Server=.\\SQLEXPRESS;Database=recalls;Integrated Security=true"; SqlConnection cnn = new SqlConnection(connetionSsortingng); SqlCommand sqlc = cnn.CreateCommand(); sqlc.CommandType = CommandType.StoredProcedure; sqlc.CommandText = "VehicleCamp"; Ssortingng workorder = label11.Text + folio.Text + year.Text; Ssortingng status = "PENDING"; sqlc.Parameters.Add("@vin", SqlDbType.VarChar, 100).Value = //here need the values ​​of the arraylist sqlc.Parameters.Add("@id_camp", SqlDbType.Int).Value = Int32.Parse(camp.Text); sqlc.Parameters.Add("@workorder", SqlDbType.VarChar, 100).Value = workorder; sqlc.Parameters.Add("@id_client", SqlDbType.VarChar, 64).Value = label4.Text; sqlc.Parameters.Add("@status", SqlDbType.VarChar, 64).Value = status; try { cnn.Open(); sqlc.ExecuteNonQuery(); cnn.Close(); } catch (Exception ex) { MessageBox.Show("Error!"); } } 

N'ayez pas peur de requestr ce dont vous avez besoin.

Ce sera plus facile si votre code d'access aux données ne lit pas les champs directement à partir de votre interface user.

D'abord, vous pourriez créer une class comme celle-ci:

 public class VehicleCamp { public ssortingng Vin {get;set;} public int IdCamp {get;set;} public ssortingng WorkOrder {get;set;} public ssortingng IdClient {get;set;} public ssortingng Statis {get;set;} } 

Il serait préférable d'avoir une class distincte pour insert des loggings afin que chaque class ait une responsabilité unique. Mais pour l'instant vous pouvez simplement modifier votre méthode:

 public void InsertVinCamp(VehicleCamp vinCamp) // guessing at names { ... 

Maintenant votre méthode InsertVinCamp obtient ses valeurs du paramètre qui lui est passé. Il ne lit pas les champs de l'interface user. De cette façon, chaque méthode n'a qu'une chose à faire. Une méthode lit les valeurs du formulaire. L'autre méthode ne sait pas d'où proviennent les valeurs – elle insère simplement ce qui lui est passé.

Vous pouvez maintenant créer une instance de VehicleCamp pour chaque logging que vous souhaitez insert.

 var vc = new VehicleCamp { IdCamp = Int32.Parse(camp.Text), WorkOrder = label11.Text + folio.Text + year.Text, // etc. } 

Si vous avez une list de VIN, vous pouvez le faire (j'utilise une List place d'une ArrayList .)

 public void InsertVehicleWithMultipleVins(VehicleCamp vehicle, List<ssortingng> vins) { foreach(var vin in vins) { vehicle.Vin = vin; InsertVinCamp(vehicle); } }