2016-04-16 6 views
2

Ich habe ein Textfeld und datetime wo kann ich eine ganze Zahl eingeben. Ich möchte dies in einer SQL Server-Datenbank speichern. Wenn ich nichts eingebe, würde ich NULL speichern. Wenn jedoch das Textfeld leer bleibt, erhalte ich einen Fehler Eingabe-String hatte kein richtiges Format.Wie Einfügen von Null aus TextBox in Ganzzahl Feld

Wie kann ich das umgehen und die Null in die db?

Der Code ist wie folgt:

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(); 
    } 

und diesen Kodex in 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)); 

und diese Tabelle

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

können Sie Attribut Validation verwenden –

+0

Sie sollten Ihren Code vereinfachen und zu dem Punkt sein. Viele Menschen werden sich nicht die Mühe machen, all diesen Code zu lesen. – FLICKER

Antwort

0

Sie erhalten die Format Exception (Eingabezeichenfolge war nicht in der richtigen Format), weil mindestens eines Ihrer Textfelder keine gültige Dezimalzahl enthielt.

Sie könnten Decimal.TryParse statt Convert.ToDecimal für alle Ihre Variablen verwenden.

Alternativ können Sie diese Felder überprüfen und überprüfen, ob das Textfeld einen Wert enthält.

Ein anderes Problem ist, dass Ihre Logik fehlerhaft ist. Betrachten Sie diese Zeilen im Code:

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; 

Sie richtig FromDate und ToDate deklarieren und dann die SQL-Parameter eingerichtet, um die Werte aus dem Textfeld zu haben, können Sie dann ovveride diesen Wert mit NULL daher für jede INSERT Anweisung, die Sie ausführen Ihre Tabelle enthält immer keine Daten anstelle der Daten, die der Benutzer über Ihr Formular eingegeben hat.

Als eine zusätzliche Anmerkung Ihre Add_ItemSeasonalPrices scheint eine Menge von Parametern aufzunehmen, ist es vielleicht am besten, dies in einer Klasse (SeasonalItems) zu haben, die viel einfacher sein wird, mit zu arbeiten.

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

Und dann können Sie diese als Parameter an die Methode verwenden, wie unten dargestellt:

public void AddItemSeasonalPrices(SeasonalItems items) 
{ 

} 

Sie die Klasse erweitern könnte weiter, um mehr Einheiten zu empfangen, wie die Anwendung wächst, aber ich glaube, das ist würde für jetzt ausreichen.

0

Viele Orte sollten Sie in Betracht ziehen, Ihren Code zu ändern.

Ändern Add_ItemSeasonalPrices Definition zu akzeptieren nullableDateTime Wert.

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) 
    { 
     ..... 
    } 

Und in btn_save, fügen Validierung vor 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); 

Und nicht zuletzt zu konvertieren, wird Code jeden parameter Wert zu überschreiben.

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; 
Verwandte Themen