2012-01-06 21 views
9

utilizzando una istruzione preparata in C#.Utilizzo di SqlDBType.Decimal nell'istruzione preparata C#

SqlCommand inscommand = new SqlCommand(supInsert, connection); 
inscommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 
inscommand.Prepare(); 
u = inscommand.ExecuteNonQuery(); 

Il codice sopra tiri sotto eccezione:

metodo SqlCommand.Prepare richiede parametri di tipo 'decimale' avere impostato esplicitamente precisione e scala.

EDIT: Come evitare questa eccezione

+0

Hai una domanda? Cosa trovi poco chiaro sull'errore? – Oded

+0

Salve, Sì Sto ottenendo l'eccezione di cui sopra per impostare la precisione e la scala. –

+0

E? Cosa non è chiaro sull'errore? È necessario impostare precisione e scala. – Oded

risposta

28

Il seguente fisserebbe un decimale con precisione 18 e Scala 8 (decimale (18,8))

SqlCommand insertCommand= new SqlCommand(supInsert, connection); 
insertCommand.Parameters.Add("@ordQty", SqlDbType.Decimal,18); 

insertCommand.Parameters["@ordQty"].Precision = 18; 
insertCommand.Parameters["@ordQty"].Scale = 8; 

insertCommand.Prepare(); 
u = insertCommand.ExecuteNonQuery(); 
3

Si dovrà definire in modo esplicito di precisione e scala per questo parametro.

SqlParameter ordQty = cmd.Parameters.Add("@ordQty", SqlDbType.Decimal); 
ordQty.Precision = x; //Replace x with what you expect in Sql Sp 
ordQty.Scale = y; //Replace y with what you expect in Sql Sp 
ordQty.Value = 18; //Set value here 
inscommand.Parameters.Add(ordQty); 
4

provare questo:

SqlParameter parameter = new SqlParameter("@ordQty", SqlDbType.Decimal); 
parameter.Precision = 18; 
parameter.Scale = 0; 
parameter.Value = YOURVALUEHERE; 
inscommand.Parameters.Add(parameter); 
6

Come l'eccezione ha sottolineato, è necessario impostare in modo esplicito le proprietà SqlParameter.Precision e SqlParameter.Scale al fine di utilizzare il tipo di decimal come parametro.

Diciamo che il campo SQL sia di tipo decimal(18,8). Il modo per farlo in linea è quello di utilizzare brace-inizializzazione per lo SqlParameter, mentre l'aggiunta al SqlParameterCollection, come segue:

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8 }); 

Si può anche fare

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8}).Value = 0.4m; // or whatever 

per aggiungere il valore, se si bisogno di uno. Si potrebbe anche fare

cmd.Parameters.Add(new SqlParameter("@ordGty", SqlDbType.Decimal) { 
    Precision = 18, Scale = 8, Value = 0.4m /* or whatever */}); 

se si preferisce. Brace initialization è davvero potente.

Nota a margine: mi rendo conto che si tratta di una vecchia domanda, ma penso che questo modulo sia molto più leggibile rispetto alla creazione dell'oggetto mentre lo aggiunge all'elenco e quindi imposta la scala e la precisione. Per i posteri! (poiché si tratta di un risultato di ricerca google con un elevato numero di annunci)