26 messaggi dal 02 luglio 2002
Se ho un dato numerico con decimali (es. un importo in Euro) preso da un TextBox (esempio 150,50) e lo passo come parametro ad una Stored Procedure di aggiornamento, come devo formattarlo affinchè venga letto come 150.50? (La query lo vuole in questo formato)
Grazie
usa Convert.ToDecimal per convertire la stringa in un Decimal. dovrebbe bastare.

Daniele Bochicchio | ASPItalia.com | Libri
Chief Operating Officer@iCubed
Microsoft Regional Director & MVP
26 messaggi dal 02 luglio 2002
Il parametro che mi arriva è gia Decimal.

Allego la parte di codice dove viene eseguita la Stored Procedure:
sub UpdateBalance(decNewAmount as Decimal)
dim objCmd as OleDbCommand = new OleDbCommand("spUpdateBalance", Conn)
objCmd.CommandType = CommandType.StoredProcedure


decNewAmount=convert.ToDecimal(decNewAmount)
dim objParam as OleDbParameter
objParam = objCmd.Parameters.Add("@NewBalance", OleDbType.Decimal)
objParam.Direction = ParameterDirection.Input
objParam.Value = decNewAmount


try
objCmd.Connection.Open()
objCmd.ExecuteNonQuery

catch ex as OleDbException
lblMessage.Text = ex.Message
finally
objCmd.Connection.Close()
end try
end sub


Quando passo il parametro decNewAmount alla sub, decNewAmount vale ad es. 150,50.
La Stored Procedure lo vuole invece nel formato 150.50

Grazie
11.886 messaggi dal 09 febbraio 2002
Contributi

decNewAmount vale ad es. 150,50.
La Stored Procedure lo vuole invece nel formato 150.50


150,50 e 150.50 non sono numeri, sono rappresentazioni STRINGA di un numero. Se per esempio il tipo di dati decimal occupa in memoria 4 byte, troverai che nessuno di quei 4 byte è punto o virgola.
Morale: se passi un decimale ad una funzione che accetta un decimale non ci saranno mai problemi di incomprensione.

non ho mai usato le stored procedures però immagino che nel mezzo ci sia una qualche riconversione automatica da numero a stringa da parte del data provider o altro.

Per risolvere, credo che dovresti passare il dato come stringa, dopo aver esplicitamente fatto un replace sulla virgola.
Poi farai il casting a numerico nella stored procedure usando CDbl (<-- questo si può usare nelle stored proc?)
ciao



Modificato da BrightSoul il 18 agosto 2003 18.25 -

Enjoy learning and just keep making
26 messaggi dal 02 luglio 2002
Ho provato il tuo suggerimento, ma senza successo.
Il problema è che le Stored Procedure (in Access le query) usate in modalità interattiva accettano i numeri con la virgola, mentre da codice (vedi SQL relativo) trasformano la virgola in punto (formato americano).
In procedure Access sono riuscito a risolvere questo problema costruendo passo passo la stringa SQL e passando il parametro numerico dopo averlo trattato con un Replace.
Qui in questo formalismo non riesco a trovare il modo corretto.
Grazie
26 messaggi dal 02 luglio 2002
Ho rifatto la cosa senza Stored Procedure e il tutto funziona.
Allego il codice:
sub UpdateBalance(decNewAmount as Decimal)

'Metodo con Stored Procedure
'***************************
dim objCmd as OleDbCommand = new OleDbCommand("spUpdateBalance", Conn)
objCmd.CommandType = CommandType.StoredProcedure


'set parameters for stored procedure
dim objParam as OleDbParameter
objParam = objCmd.Parameters.Add("@NewBalance", OleDbType.Decimal)
objParam.Direction = ParameterDirection.Input
objParam.Value = decNewAmount


objParam = objCmd.Parameters.Add("@UserID", OleDbType.BSTR)
objParam.Direction = ParameterDirection.Input
objParam.Value = Request.Cookies("Account").Value
'***************************


'Metodo senza Stored Procedure
'*****************************
dim decNewAmount1

decNewAmount1=replace(cstr(decNewAmount),",",".")
dim strSQL as string = "UPDATE tblAccounts SET tblAccounts.Balance =" & decNewAmount1 & " " & _
"WHERE tblAccounts.UserID=" & Request.Cookies("Account").Value & ";"
dim objCmd as OleDbCommand = new OleDbCommand(strSQL, Conn)
'*****************************

try
objCmd.Connection.Open()
objCmd.ExecuteNonQuery

catch ex as OleDbException
lblMessage.Text = ex.Message
finally
objCmd.Connection.Close()
end try
end sub


Siccome il metodo con le Stored Procedure è più veloce (una Stored Procedure è compilata) mi piacerebbe trovare una soluzione.

Grazie.
52 messaggi dal 13 marzo 2002
Ti posto un pò di codice ma in C# con l'utilizzo di una SP:

public int Ordina(string IDCliente, string IDCarrello, string pagamento, string Totale)
{
// Crea una Connessione a SQL Server e un oggetto Command
SqlConnection myConnection = new SqlConnection(ConfigurationSettings.AppSettings["ConnectionSQL"]);
SqlCommand myCommand = new SqlCommand("AddOrdine", myConnection);

// Imposta l'oggetto Command come SPROC
myCommand.CommandType = CommandType.StoredProcedure;

// Aggiunge parametri alla SPROC
SqlParameter parameterIDCliente = new SqlParameter("@IDCliente", SqlDbType.Int, 4);
parameterIDCliente.Value = Int32.Parse(IDCliente);
myCommand.Parameters.Add(parameterIDCliente);

SqlParameter parameterIDCarrello = new SqlParameter("@IDCarrello", SqlDbType.NVarChar, 50);
parameterIDCarrello.Value = IDCarrello;
myCommand.Parameters.Add(parameterIDCarrello);

SqlParameter parameterpagamento = new SqlParameter("@Pagamento", SqlDbType.VarChar, 1);
parameterpagamento.Value = pagamento;
myCommand.Parameters.Add(parameterpagamento);

SqlParameter parameterTotale = new SqlParameter("@Totale", SqlDbType.Decimal, 5);
parameterTotale.Value = Decimal.Parse(Totale);
myCommand.Parameters.Add(parameterTotale);

SqlParameter parameterIDOrdine = new SqlParameter("@IDOrdine", SqlDbType.Int, 4);
parameterIDOrdine.Direction = ParameterDirection.Output;
myCommand.Parameters.Add(parameterIDOrdine);

// Apre la connessione ed esegue il comando
myConnection.Open();
myCommand.ExecuteNonQuery();
myConnection.Close();

// Restituisce l'IDOrdine
return (int)parameterIDOrdine.Value;
}


Ciao
Umberto
26 messaggi dal 02 luglio 2002
Se ho ben capito il parametro Totale arriva come stringa e poi con
parameterTotale.Value = Decimal.Parse(Totale);
lo trasformi in decimale per passarlo alla SP.
Ho provato ma non funziona.
Io uso come database Access e non SQLServer. Nelle SP usate da codice e non in modo interattivo, Access vuole i parametri numerici nel formato americano (es. 1,000.50).
Il tuo codice funziona?
Grazie

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.