2013-09-23 9 views
5

Buona giornata a tutti,Errore tipo di dati Conversione 'numerico' di decimale (aiuto!)

A partire da ora im bloccato con questo errore

Error Converting data type 'Numeric' to Decimal 

questo è il mio codice

AddManualItems AddReconItem = new AddManualItems(); 
     UserAccess user = new UserAccess(); 
     AddReconItem.BranchCode = BranchCodeTextBox.Text; 
     AddReconItem.ForLoanMonth = YearDropDownList.SelectedValue + "/" + MonthDropDownList.SelectedValue; 
     AddReconItem.ItemWeight = Convert.ToDecimal(WeightTextBox.Text);  
     AddReconItem.PrincipalAmount = Convert.ToDecimal(PrincipalTexAmTextBox.Text); 
     AddReconItem.PawnTicket = PwnTicketTextBox.Text; 
     AddReconItem.ItemStorageGroup = Convert.ToInt16(StorageNameDropDownList.SelectedValue); 
     AddReconItem.ReconID = Convert.ToInt16(ReconTypeDropDownList.SelectedValue); 
     user.UserID = Session["UserID"].ToString(); 

     string a = servs.AddItemRecon(user, AddReconItem); // this is where the error appears in debug mode 

il codice all'interno di ADDitemRecon (Utente, AddReconItem) è questo

using (SqlConnection reportsConn = new SqlConnection(sqlConnWriter)) 
      { 
       reportsConn.Open(); 
       SqlCommand AddReconItem = new SqlCommand(); 
       AddReconItem.Connection = reportsConn; 
       AddReconItem.CommandType = CommandType.StoredProcedure; 
       AddReconItem.CommandText = "Updater.usp_AddReconcileItems"; 
       AddReconItem.Parameters.AddWithValue("@ITEMWEIGHT", Convert.ToDecimal(items.ItemWeight)); 
       AddReconItem.Parameters.AddWithValue("@ITEMPRINCIPALAMT", Convert.ToDecimal(items.PrincipalAmount)); 
       AddReconItem.Parameters.AddWithValue("@FORLOANMONTH", Convert.ToDateTime(items.ForLoanMonth)); 
       AddReconItem.Parameters.AddWithValue("@STORAGEGROUPID", items.ItemStorageGroup); 
       AddReconItem.Parameters.AddWithValue("@BRANCHCODE", items.BranchCode); 
       AddReconItem.Parameters.AddWithValue("RECONID", items.ReconID); 
       AddReconItem.Parameters.AddWithValue("@PAWNTIX",items.PawnTicket); 
       AddReconItem.Parameters.AddWithValue("@CREATEDBY", user.UserID.ToString()); 
       AddReconItem.ExecuteNonQuery(); 
      } 

mia proprietà per ItemWeight è

private decimal itemWeight; 

    public decimal ItemWeight 
    { 
     get { return itemWeight; } 
     set { itemWeight = value; } 
    } 

Scommetto l'errore è nel peso dell'articolo, perché quando ho ingresso nel peso dell'articolo 12.345,12 funziona benissimo, ma quando di ingresso 1234, invece di trattarlo come 1234.00 si tratta come 1234 rendendolo solo numerico ..

aiuto? non so se le mie conversioni sono sbagliate

Tra l'altro il mio campo nel database è

fld_ItemWeight (decimal (38,6), not null 

EDIT ** È stato rilevato qualche bug conosciuti in decimale ?? sto usando VS 2005 al momento.

risposta

8

trovato la risposta! la mia stored procedure è errata ho decimale (9,6) nella mia stored procedure facendo accettere 3 cifre o meno! cambiato in (18,2) \

-1

quando si chiama una procedura e ha un parametro con un tipo di dati decimale, quindi è possibile passare solo in frazioni. Per ulteriori dettagli, consultare Error converting data type numeric to decimal

+1

decimale (38,6) ho questo, sulla base del articled voi dato questo non dovrebbe generare alcun errore, le frazioni sono applicabili solo a chi ha una dichiarazione di (2,2) stessa precisione e lo stesso numero di decimali consentito. – user2705620

0

Non so quale sia la soluzione corretta per questo problema, ma ho un'idea. Come

Cambia la tua ItemWeight proprietà DataType decimale a stringa

decimal xxxyyy = Convert.ToDecimal(WeightTextBox.Text); 

    if(!xxxyyy .ToString().Contains(".00)) 
    { 
     AddReconItem.ItemWeight=xxxyyy.ToString() +".00"; 
    } 
    else 
    { 
    AddReconItem.ItemWeight=xxxyyy.ToString() ; 
    } 

Edit:

Prova questa un altro modo per l'uso math.Round()

AddReconItem.ItemWeight = Convert.ToDecimal(WeightTextBox.Text);  
AddReconItem.ItemWeight=Math.Round(AddReconItem.ItemWeight,2); 
+0

già provato ma senza fortuna, quando si converte in Decimale ogni 00 dopo il. viene rimosso e non so perché l'ho appena visto in modalità debug – user2705620

+0

a 112345.00 quando convertito restituisce 112345 cioè i valori che vengono passati nel database e questo è dove si verifica l'eccezione forse – user2705620

+0

@DanzaiVer Modifica la colonna del database DataType decimale a nvarchar e prova la mia soluzione –

0

Anche se il poster originale ha trovato la sua soluzione, per il beneficio di altre persone, ho pensato di pubblicare ciò che lo ha causato per me.

System.Data.SqlClient.SqlException: Errore durante la conversione del tipo di dati numerico in decimale.

Purtroppo il messaggio non dice con quale parametro si sta verificando il problema. Così ho cambiato tutti i parametri che stavo passando per avere un valore di 0 (che è un valore adatto per la maggior parte dei tipi SQL, potrebbe essere necessario utilizzare altri valori), questo ha fatto sì che l'errore sparisse. Potrei quindi rimetterli alla normalità, uno per uno, e ogni volta, ho ri-testato. È così che ho capito quale parametro ha avuto il problema.

Si è scoperto che per uno dei parametri il valore che avevo nel mio codice (un decimale C#) era troppo grande per andare nel parametro della procedura memorizzata decimale (7,2).

+0

solo un promemoria, (7,2) decimale significa che 7 è la lunghezza dell'intero decimale e 2 di questi è decimale, intendendo dire che il tuo intero valore consisterà solo di 5 numeri e 2 posizioni decimali. – user2705620

0

Cerca di arrotondare il valore nel set.

private decimal itemWeight;

public decimal ItemWeight 
{ 
    get { return itemWeight; } 
    set { itemWeight = Math.Round(value,yourPrecisionHere); } 
} 
0
colonna

Change Sql al decimale (18,2), lo stesso in procedura di memorizzazione e prendere SqlDbType.Decimal alla fine ado.net