2016-04-16 80 views
2

我有一个文本框和日期时间,我可以在哪里输入整数。我希望将其存储在SQL Server数据库中。如果我什么都没输入,那么我会储存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] 
+0

你可以使用属性验证 –

+0

你应该简化你的代码并且做到点。很多人不会自己去阅读所有的代码。 – FLICKER

回答

0

您会收到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参数最多有从文本框中的值,你再ovveride这个值与NULL,因此每个INSERT声明你执行您的表格将始终不包含数据,而不包含用户通过表单输入的数据。

作为一个额外的注意事项,您的Add_ItemSeasonalPrices似乎需要很多参数,最好在类中使用(SeasonalItems),这将更容易处理。

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

然后你就可以用这个作为参数传递给方法,如下图所示:

public void AddItemSeasonalPrices(SeasonalItems items) 
{ 

} 

你可以扩展该类进一步随着应用的增长,以容纳更多的单位,但我相信这现在就足够了。

0

很多地方你应该考虑修改你的代码。

修改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; 
相关问题