salve,
mi pare di capire che la domanda sia piu' legata a problematiche di accesso ai dati e quindi non direttamente collegabile a SQL Server, comunque...
alexlupo wrote:
Salve, devo salvare dati di tipo money ma ho un problema
. Il dato che devo assegnare al parametro (SqlParameter) lo leggo da un file di testo ed è con la virgola per cui eseguo una replace della virgola con il punto e se le impostazioni del server su cui gira la procedura prevedono il punto decimale l'inserimento avviene correttamente altrimenti il punto viene considerato separatore delle migliaia e l'inserimento non lo prende in considerazione.
Potete dirmi come ci si deve comportare in questi casi
Grazie
non ho ben compreso, visto che non l'hai indicato, come carichi il parametro..
se utilizzi un varchar ovviamente devi presentare il relativo valore direttamente convertito nel separatore decimale.. puoi pero', ad esempio, utilizzare il tipo "nativo" cioe' SqlDbType.Money che pero' devi comunque caricare correttamente.. di seguito ho utilizzato Vb.Net, dichiarando un parametro di tipo SqlDbType.Money.. questo viene caricato utilizzando decimal.parse ("123.456,789") che ovviamente e' una formattazione italiana.. ho poi cambiato la CultureInfo del thread su "en-US" in modo che cambiassero le impostazioni dei separatori delle migliaia e decimali ed ovviamente, sempre che la rappresentazione testuale del numero fosse in accordo con la cultura (ParamValue = "789,123.456") questo e' stato correttamente interpretato e passato al parametro, e quindi caricato sul db..
codice T-SQL
SET NOCOUNT ON;
USE tempdb;
GO
CREATE TABLE dbo.t (
Id int NOT NULL IDENTITY PRIMARY KEY,
v money NOT NULL DEFAULT 0
);
GO
/codice T-SQL
codice Net
Dim conn As New System.Data.SqlClient.SqlConnection
With conn
.ConnectionString =
"Server=(Local)\SQLExpress

atabase=tempdb;Trusted_Connection=True;Connection Timeout=5;"
.Open()
End With
Dim cmdText As String = String.Format("INSERT INTO dbo.t VALUES ( @Value )")
Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture.DisplayName) Dim ParamValue As String = "123.456,789"
Dim SqlValue As Decimal = Decimal.Parse(ParamValue,
Globalization.NumberStyles.AllowDecimalPoint Or
Globalization.NumberStyles.AllowThousands)
Dim cmd As New System.Data.SqlClient.SqlCommand
With cmd
.CommandText = cmdText
.CommandType = CommandType.Text
.Connection = conn
Dim par As New SqlClient.SqlParameter
With par
.ParameterName = "@Value"
.Direction = ParameterDirection.Input
.SqlDbType = SqlDbType.Money
.SqlValue = SqlValue
End With
.Parameters.Add(par)
par = Nothing
End With
cmd.ExecuteNonQuery()
System.Threading.Thread.CurrentThread.CurrentCulture = New
System.Globalization.CultureInfo("en-US", True)
Console.WriteLine(System.Globalization.CultureInfo.CurrentCulture.DisplayName) ParamValue = "789,123.456"
SqlValue = Decimal.Parse(ParamValue,
Globalization.NumberStyles.AllowDecimalPoint Or
Globalization.NumberStyles.AllowThousands)
With cmd.Parameters("@Value")
.SqlValue = SqlValue
End With
cmd.ExecuteNonQuery()
cmd.Dispose()
conn.Close()
cmd = Nothing
conn = Nothing
/codice Net
codice T-SQL
SELECT * FROM dbo.t;
GO
DROP TABLE dbo.t;
/codice T-SQL
saluti