将参数值(有时是null值)传递给存储过程

时间:2018-05-04 07:12:25

标签: c# sql-server

我想传递参数值有时得到null值到存储过程,我的存储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转换为其他类型。如果值为null,我不想保存0因为我将根据该列进行一些过滤,如何解决这个问题,提前感谢我对以前的代码感到非常抱歉。

4 个答案:

答案 0 :(得分:0)

您无法将DBNull转换为int,因此您应该使用下面的某个表达式作为第二个参数:

txtDescription.Text == DBNull.Value ? txtDescription.Text : Convert.ToInt32(txtDescription.Text)

答案 1 :(得分:0)

你的问题在这里:

param[1].Value = DBNull.Value.Equals(description)? 0 : description;

您无法为整数数据类型指定空值;

或其他选项将int更改为varchar:

Create Proc Add_Grade
@Name varchar (10),
@Description varchar (10)

答案 2 :(得分:0)

如果txtDescription为null,则可以将其设为“0”。将转换为0

prd.Add_Grade(txtName.Text, Convert.ToInt32(txtDescription?.Text ?? "0"));

答案 3 :(得分:0)

首先更改从网格中读取每个项目的值的循环

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;