Click here to Skip to main content
15,888,521 members
Please Sign up or sign in to vote.
0.00/5 (No votes)
See more:
i want to pass parameter value sometimes get null value into stored procedure,my stored procuder look like this
SQL
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)

my c# code look like this
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();

}

and i use this code to save my data
C#
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")));

            }

when IDProjet column have a value the code run without error but when it does not contain any value i get this error:Object cannot be cast from DBNull to other types.I do not want to save 0 if the value is null because i will do some filtering depending on that column, how i can solve this problem,thanks in advance.

What I have tried:

i try to use Nullable<int> but did not work for me
Posted
Updated 4-May-18 0:04am
Comments
GKP1992 4-May-18 5:38am    
Try casting Project to object type and before assigning to the param value.
Better yet, try this
param[8].Value = (object)(Project ?? DBNull.Value);
Mahfoud Bouabdallah 4-May-18 5:42am    
I tried but I got the same error:Object cannot be cast from DBNull to other types

1 solution

I get help from Steve and this is the solution
C#
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);
}


C#
param[8] = new SqlParameter("@ID_Project", SqlDbType.Int);
param[8].Value = Project.HasValue ? Project : (object)DbNull.Value;
 
Share this answer
 
Comments
GKP1992 4-May-18 6:12am    
Good man Steve.

This content, along with any associated source code and files, is licensed under The Code Project Open License (CPOL)



CodeProject, 20 Bay Street, 11th Floor Toronto, Ontario, Canada M5J 2N8 +1 (416) 849-8900