Logo UGIdotNET

Discussione 'OleDbParameter, Decimal e localizzazione'

# Pubblicato il 09 dic 2009 11.54 - Rispondi
Mario Duzioni
OleDbParameter, Decimal e localizzazione
Ho un problema di cui ho trovato diversi risconti in rete ma nessuna risposta.

Utilizzando OleDbType.Decimal con un OleDbParameter, sembrerebbe che la localizzazione non venga più gestita in automatico (come invece avviene, per esempio, con Date, Single, ecc).

Tanto per capirci, specificando 2.5 come valore del parametro, su un sistema con regional setting impostato su italiano, quel 2.5 "diventa" 25.

Qualcuno ha già riscontrato il problema?

Ho letto in diversi post che potrebbe trattarsi di un bug, ma mi sembra davvero molto improbabile che sia sfuggito per così tanti anni.

Se serve posto del codice di esempio.
Grazie!

Mario
# Pubblicato il 09 dic 2009 13.58 - Rispondi
Andrea Romeo
Re: OleDbParameter, Decimal e localizzazione
Ciao Mario ,
Riesci a postare il codice di esempio ?
# Pubblicato il 09 dic 2009 14.48 - Rispondi
Mario Duzioni
Re: OleDbParameter, Decimal e localizzazione
Ciao Andrea!

Eccolo, anche se probabilmente risulterà poco leggibile... :-(
Per farlo girare serve un file "Export.xls" vuoto nella cartella dell'eseguibile.

Grazie!

using System;
using System.Data.OleDb;

namespace DecimalTroubleshooting
{
class Program
{
static void Main(string[] args)
{
string fileName = "Export.xls";

using (OleDbConnection cn = new OleDbConnection(string.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source={0};Extended Properties=\"Excel 8.0;HDR=YES;\"", fileName)))
{
try
{
using (OleDbCommand cmd = new OleDbCommand())
{
cmd.Connection = cn;
cn.Open();

cmd.CommandText = "CREATE TABLE [ExportSheet] ( [Field1] decimal (18,2) NULL, [Field2] currency null )";
cmd.ExecuteNonQuery();
Console.WriteLine("Foglio creato");

cmd.CommandText = "INSERT INTO [ExportSheet] ( Field1, Field2 ) VALUES ( @Field1, @Field2 )";

OleDbParameter param1 = new OleDbParameter("@Field1", OleDbType.Decimal);
param1.Value = 1234.56M;
cmd.Parameters.Add(param1);

OleDbParameter param2 = new OleDbParameter("@Field2", OleDbType.Currency);
param2.Value = 1234.56M;
cmd.Parameters.Add(param2);

cmd.ExecuteNonQuery();
Console.WriteLine("Operazione completata.");
}
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
finally
{
if (cn != null && cn.State == System.Data.ConnectionState.Open)
{
cn.Close();
}
}
}
Console.ReadLine();
System.Diagnostics.Process.Start(fileName);
}
}
}
# Pubblicato il 09 dic 2009 15.01 - Rispondi
Andrea Romeo
Re: OleDbParameter, Decimal e localizzazione
Ciao. avevo capito che avessi problemi con access :D !Deve essere qualche impostazione di excel. Ti direi se non hai particolari esegigenze di utilizzare XML speadsheet (http://msdn.microsoft.com/en-us/library/aa140066(office.10).aspx ) puoi gestire facilmente la formattazioni delle celle direttamente dal codice xml. Fammi sapere se come soluzione può andarti bene .
# Pubblicato il 09 dic 2009 15.10 - Rispondi
Mario Duzioni
Re: OleDbParameter, Decimal e localizzazione
No, è un problema che riguarda l'utilizzo di OleDbParameter in abbinamento all'OleDbType.Decimal.

Un workaround immediato è quello che indico implicitamente nel codice, cioè utilizzare OleDbType.Currency per i Decimal, ma ho la necessità (per alcuni motivi) di sapere se si tratta di un bug di OleDbParameter o di un mio errore nell'utilizzo.

Grazie, ciao!

Mario

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185