【问题标题】:How to Insert null from TextBox to integer Field如何将空值从文本框插入整数字段
【发布时间】:2016-04-16 09:28:28
【问题描述】:

我有一个文本框和日期时间,我可以在其中输入一个整数。我希望将其存储在 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]

【问题讨论】:

  • 你可以使用属性验证
  • 您应该简化您的代码并切中要害。许多人不会费心阅读所有这些代码。

标签: c# sql .net sql-server database


【解决方案1】:

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

修改Add_ItemSeasonalPrices定义以接受nullableDateTime值。

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;

【讨论】:

    【解决方案2】:

    您收到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)
    {
    
    }
    

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

    【讨论】:

      猜你喜欢
      • 2021-07-15
      • 1970-01-01
      • 1970-01-01
      • 2014-01-20
      • 2012-05-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多