如何将文本框中的null插入到integer字段中



我有一个文本框和日期时间,我可以在其中输入一个整数。我希望将其存储在SQL Server数据库中。如果我什么都不输入,那么我将存储NULL。但是,如果文本框为空,我会得到一个错误输入字符串的格式不正确。

我如何解决这个问题,并将null放入数据库?

代码如下:

public void Add_ItemSeasonalPrices(string ItemCode, DateTime FromDate, DateTime ToDate, decimal WholeSaleForFirstUnit, decimal WholeSaleForSecondUnit, decimal WholeSaleForThirdUnit,
        decimal HalfWholeSaleForFirstUnit, decimal HalfWholeSaleForSecondUnit, decimal HalfWholeSaleForThirdUnit,
        decimal DistributorForFirstUnit, decimal DistributorForSecondUnitt)
    {
        DAL.DataAccessLayer DAL = new DAL.DataAccessLayer();
        DAL.open();
        SqlParameter[] param = new SqlParameter[22];
        param[0] = new SqlParameter("@ItemCode", SqlDbType.NVarChar, 25);
        param[0].Value = ItemCode;
        param[1] = new SqlParameter("@FromDate", SqlDbType.DateTime);
        param[1].Value = FromDate;

        param[2] = new SqlParameter("@ToDate", SqlDbType.DateTime);
        param[2].Value = ToDate;

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

        param[4] = new SqlParameter("@WholeSaleForSecondUnit", SqlDbType.Decimal);
        param[4].Value = WholeSaleForSecondUnit;

        param[5] = new SqlParameter("@WholeSaleForThirdUnit ", SqlDbType.Decimal);
        param[5].Value = WholeSaleForThirdUnit;
        param[6] = new SqlParameter("@HalfWholeSaleForFirstUnit", SqlDbType.Decimal);
        param[6].Value = HalfWholeSaleForFirstUnit;

        param[7] = new SqlParameter("@HalfWholeSaleForSecondUnit", SqlDbType.Decimal);
        param[7].Value = HalfWholeSaleForSecondUnit;

        param[8] = new SqlParameter("@HalfWholeSaleForThirdUnit", SqlDbType.Decimal);
        param[8].Value = HalfWholeSaleForThirdUnit;

        param[9] = new SqlParameter("@DistributorForFirstUnit", SqlDbType.Decimal);
        param[9].Value = DistributorForFirstUnit;

        param[10] = new SqlParameter("@DistributorForSecondUnit", SqlDbType.Decimal);
        param[10].Value = DistributorForSecondUnit;

        DAL.ExecuteCommand("Add_ItemSeasonalPrices", param);
        DAL.close();
    }

以及btnSave 中的此代码

Item.Add_ItemSeasonalPrices(txt_ItemCode.Text, Convert.ToDateTime(FromDate.Text), Convert.ToDateTime(ToDate.Text), Convert.ToDecimal(txt_WholeSaleForFirstUnit.Text), Convert.ToDecimal(txt_WholeSaleForSecondUnit.Text),
                                            Convert.ToDecimal(txt_WholeSaleForThirdUnit.Text), Convert.ToDecimal(txt_HalfWholeSaleForFirstUnit.Text),
                                            Convert.ToDecimal(txt_HalfWholeSaleForSecondUnit.Text), Convert.ToDecimal(txt_HalfWholeSaleForThirdUnit.Text),
                                            Convert.ToDecimal(txt_DistributorForFirstUnit.Text), Convert.ToDecimal(txt_DistributorForSecondUnit.Text));

这个表

CREATE TABLE [dbo].[ItemSeasonalPrices](
[ItemCode] [nvarchar](25) NOT NULL,
[FromDate] [date] NULL,
[ToDate] [date] NULL,
[WholeSaleForFirstUnit] [decimal](18, 3) NULL,
[WholeSaleForSecondUnit] [decimal](18, 3) NULL,
[WholeSaleForThirdUnit] [decimal](18, 3) NULL,
[HalfWholeSaleForFirstUnit] [decimal](18, 3) NULL,
[HalfWholeSaleForSecondUnit] [decimal](18, 3) NULL,
[HalfWholeSaleForThirdUnit] [decimal](18, 3) NULL,
[DistributorForFirstUnit] [decimal](18, 3) NULL,
[DistributorForSecondUnit] [decimal](18, 3) NULL,
[DistributorForThirdUnit] [decimal](18, 3) NULL,
[ExportForFirstUnit] [decimal](18, 3) NULL,
[ExportForSecondUnit] [decimal](18, 3) NULL,
[ExportForThirdUnit] [decimal](18, 3) NULL,
[RetailForFirstUnit] [decimal](18, 3) NULL,
[RetailForSecondUnit] [decimal](18, 3) NULL,
[RetailForThirdUnit] [decimal](18, 3) NULL,
[EndUserForFirstUnit] [decimal](18, 3) NULL,
[EndUserForSecondUnit] [decimal](18, 3) NULL,
[EndUserForThirdUnit] [decimal](18, 3) NULL,
[PriceDefault] [int] NULL
) ON [PRIMARY]

在许多地方您应该考虑修改代码。

修改Add_ItemSeasonalPrices定义以接受nullable DateTime值。

public void Add_ItemSeasonalPrices(string ItemCode, DateTime? FromDate, DateTime? ToDate, decimal WholeSaleForFirstUnit, decimal WholeSaleForSecondUnit, decimal WholeSaleForThirdUnit,
        decimal HalfWholeSaleForFirstUnit, decimal HalfWholeSaleForSecondUnit, decimal HalfWholeSaleForThirdUnit,
        decimal DistributorForFirstUnit, decimal DistributorForSecondUnit,  decimal DistributorForThirdUnit,
        decimal ExportForFirstUnit, decimal ExportForSecondUnit, decimal ExportForThirdUnit,
        decimal RetailForFirstUnit, decimal RetailForSecondUnit, decimal RetailForThirdUnit, 
        decimal EndUserForFirstUnit, decimal EndUserForSecondUnit, decimal EndUserForThirdUnit, int PriceDefault)
    {
       .....
    }

btn_save中,在转换为DateTime 之前添加验证

Item.Add_ItemSeasonalPrices(txt_ItemCode.Text, 
                            string.IsNullOrEmpty(FromDate.Text)? null: Convert.ToDateTime(FromDate.Text), 
                            string.IsNullOrEmpty(ToDate.Text)? null: Convert.ToDateTime(ToDate.Text), Convert.ToDecimal(txt_WholeSaleForFirstUnit.Text), Convert.ToDecimal(txt_WholeSaleForSecondUnit.Text),
                                                Convert.ToDecimal(txt_WholeSaleForThirdUnit.Text), Convert.ToDecimal(txt_HalfWholeSaleForFirstUnit.Text),
                                                Convert.ToDecimal(txt_HalfWholeSaleForSecondUnit.Text), Convert.ToDecimal(txt_HalfWholeSaleForThirdUnit.Text),
                                                Convert.ToDecimal(txt_DistributorForFirstUnit.Text), Convert.ToDecimal(txt_DistributorForSecondUnit.Text), Convert.ToDecimal(txt_DistributorForThirdUnit.Text),
                                                Convert.ToDecimal(txt_ExportForFirstUnit.Text), Convert.ToDecimal(txt_ExportForSecondUnit.Text), Convert.ToDecimal(txt_ExportForThirdUnit.Text),
                                                Convert.ToDecimal(txt_RetailForFirstUnit.Text), Convert.ToDecimal(txt_RetailForSecondUnit.Text), Convert.ToDecimal(txt_RetailForThirdUnit.Text),
                                                Convert.ToDecimal(txt_EndUserForFirstUnit.Text), Convert.ToDecimal(txt_EndUserForSecondUnit.Text), Convert.ToDecimal(txt_EndUserForThirdUnit.Text),
                                                PriceDefault);

最后但同样重要的是,代码覆盖了每个parameter值。

    param[1] = new SqlParameter("@FromDate", SqlDbType.DateTime);
    param[1].Value = FromDate.HasValue? FromDate.Value : DBNull.Value;
    //param[1].Value = DBNull.Value;
    param[2] = new SqlParameter("@ToDate", SqlDbType.DateTime);
    param[2].Value = ToDate.HasValue? ToDate.Value : DBNull.Value;
    //param[2].Value = DBNull.Value;

您收到Format Exception(输入字符串的格式不正确),因为至少有一个文本框不包含有效的小数。

您可以对所有变量使用Decimal.TryParse而不是Convert.ToDecimal

decimal exportForFirstUnit;
decimal.TryParse(textBox1.Text, out exportForFirstUnit);

或者,您可能需要对这些字段进行一些验证,并至少检查文本框是否包含值。

另一个问题是你的逻辑有缺陷。考虑一下代码中的这些行:

param[1] = new SqlParameter("@FromDate", SqlDbType.DateTime);
param[1].Value = FromDate;
param[1].Value = DBNull.Value;
param[2] = new SqlParameter("@ToDate", SqlDbType.DateTime);
param[2].Value = ToDate;
param[2].Value = DBNull.Value;

您正确地声明了FromDateToDate,然后将SQL参数设置为具有文本框中的值,然后用NULL验证该值,因此,对于您执行的每个INSERT语句,您的表将始终不包含任何数据,而不是用户通过表单输入的数据

另外要注意的是,Add_ItemSeasonalPrices似乎包含了很多参数,最好将其放在一个更容易处理的类(SeasonalItems)中。

public class SeasonalItems
{
    public decimal WholeSaleForFirstUnit { get; set; }
    public decimal WholeSaleForSecondUnit { get; set; }
}

然后您可以将其用作方法的参数,如下所示:

public void AddItemSeasonalPrices(SeasonalItems items)
{
}

随着应用程序的增长,您可以进一步扩展类以容纳更多的单元,但我相信这就足够了。

最新更新