Mahfoud Bouabdallah Ответов: 1

Передача значения параметра (иногда получить нулевое значение) в хранимую процедуру


я хочу передать значение параметра иногда получить нулевое значение в хранимую процедуру,мой хранимый procuder выглядит следующим образом
USE [Stock]
GO
ALTER Proc [dbo].[Add_ItemQte]
@ID_Item int,
@ID_Supplier int,
@Qantity_ItemQte int,
@Date_ItemQte date,
@Lenght_ItemQte int,
@Widht_ItemQte int,
@WightT_ItemQte float,
@ID_Location int,
@ID_Project int=null
AS
INSERT INTO ItemQuantity
       ([ID_Item]
       ,[ID_Supplier]
       ,[Qantity_ItemQte]
       ,[Date_ItemQte]
       ,[Lenght_ItemQte]
       ,[Widht_ItemQte]
       ,[WightT_ItemQte]
       ,[ID_Location]
       ,[ID_Project])
 VALUES
       (@ID_Item
       ,@ID_Supplier
       ,@Qantity_ItemQte
       ,@Date_ItemQte
       ,@Lenght_ItemQte
       ,@Widht_ItemQte
       ,@WightT_ItemQte
       ,@ID_Location
       ,@ID_Project)

мой код c# выглядит примерно так
public void Add_ItemQte(int Name, int Supplier, int Qantity, DateTime Date, int Lenght,int Widht,double WightT,int Location, Nullable<int> Project)
{
    DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
    DAL.Open();
    SqlParameter[] param = new SqlParameter[9];

    param[0] = new SqlParameter("@ID_Item", SqlDbType.Int);
    param[0].Value = Name;

    param[1] = new SqlParameter("@ID_Supplier", SqlDbType.Int);
    param[1].Value = Supplier;

    param[2] = new SqlParameter("@Qantity_ItemQte", SqlDbType.Int);
    param[2].Value = Qantity;

    param[3] = new SqlParameter("@Date_ItemQte", SqlDbType.Date);
    param[3].Value = Date;

    param[4] = new SqlParameter("@Lenght_ItemQte", SqlDbType.Int);
    param[4].Value = Lenght;

    param[5] = new SqlParameter("@Widht_ItemQte", SqlDbType.Int);
    param[5].Value = Widht;

    param[6] = new SqlParameter("@WightT_ItemQte", SqlDbType.Float);
    param[6].Value = WightT;

    param[7] = new SqlParameter("@ID_Location", SqlDbType.Int);
    param[7].Value = Location;

    param[8] = new SqlParameter("@ID_Project", SqlDbType.Int);
    param[8].Value = Project;

    DAL.ExcuteCommande("Add_ItemQte", param);
    DAL.Close();

}

и я использую этот код для сохранения своих данных
for (int i=0;i<gridView1.RowCount;i++)
            {
                prd.Add_ItemQte(Convert.ToInt32(gridView1.GetRowCellValue(i, "IDNom")), Convert.ToInt32(gridView1.GetRowCellValue(i, "IDFournisseur")),
                Convert.ToInt32(gridView1.GetRowCellValue(i, "Quantité")), Convert.ToDateTime(gridView1.GetRowCellValue(i, "Date")),
                Convert.ToInt32(gridView1.GetRowCellValue(i, "Longueur")), Convert.ToInt32(gridView1.GetRowCellValue(i, "Largeur")),
                Convert.ToDouble(gridView1.GetRowCellValue(i, "Poids Total")), Convert.ToInt32(gridView1.GetRowCellValue(i, "IDLocalisation")),
                Convert.ToInt32(gridView1.GetRowCellValue(i, "IDProjet")));

            }

когда столбец IDProjet имеет значение, код запускается без ошибок, но когда он не содержит никакого значения, я получаю эту ошибку:объект не может быть приведен из DBNull в другие типы.Я не хочу сохранять 0, если значение равно null,потому что я сделаю некоторую фильтрацию в зависимости от этого столбца, как я могу решить эту проблему, заранее спасибо.

Что я уже пробовал:

я пытаюсь использовать Nullable<int>, Но у меня это не работает

GKP1992

Попробуйте привести проект к объектному типу и перед назначением значения param.
А еще лучше, попробуйте вот это

param[8].Value = (object)(Project ?? DBNull.Value);

Mahfoud Bouabdallah

Я попытался, но получил ту же ошибку:объект не может быть приведен из DBNull в другие типы

1 Ответов

Рейтинг:
12

Mahfoud Bouabdallah

Я получаю помощь от Стива и это решение

for (int i=0;i<gridView1.RowCount;i++)
{
    object value = gridView1.GetRowCellValue(i, "IDProjet");
    int? prjID = null;
if(value != null && Int32.TryParse(value.ToString(), out int temp))
    prjID = temp;

    prd.Add_ItemQte(...., prjID);
}


param[8] = new SqlParameter("@ID_Project", SqlDbType.Int);
param[8].Value = Project.HasValue ? Project : (object)DbNull.Value;


GKP1992

Хороший человек Стив.