在c#中执行存储过程N次

时间:2016-08-18 02:04:59

标签: c# sql-server stored-procedures arraylist

我有一个名为“VehicleCamp”的存储过程,此存储过程将数据插入此表:

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

这是存储过程的代码:

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

我需要在C#中执行这个存储过程,根据车辆数量,车辆可以是N个车辆。

我将车辆的VIN编号保存在ArrayList中,但我不知道如何执行存储过程N次以及如何将@vin参数分配给ArrayList中的每个元素。

这是我的C#代码:

public void insertVinCamp()
        {
            string connetionString = null;
            connetionString = "Server=.\\SQLEXPRESS;Database=recalls;Integrated Security=true";
            SqlConnection cnn = new SqlConnection(connetionString);
            SqlCommand sqlc = cnn.CreateCommand();
            sqlc.CommandType = CommandType.StoredProcedure;
            sqlc.CommandText = "VehicleCamp";
            String workorder = label11.Text + folio.Text + year.Text;
            String 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!");
            }
        }

不要害怕问你需要什么。

1 个答案:

答案 0 :(得分:1)

如果您的数据访问代码没有直接从您的UI中读取字段,这将更容易。

首先你可以创建一个这样的类:

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

最好有一个单独的类来插入记录,以便每个类都有一个责任。但是现在你可以修改你的方法:

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

现在,您的InsertVinCamp方法正在从传递给它的参数中获取其值。它不是从UI领域读取的。这样每种方法只需做一件事。一种方法从表单中读取值。另一种方法不知道值的来源 - 它只是插入传递给它的内容。

现在,您可以为要插入的每条记录构建VehicleCamp的实例。

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

如果你有一个VIN列表,你可以这样做(我使用的是List而不是ArrayList。)

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