Problemas con Access y VB.NET

25/07/2005 - 18:23 por Carlos Gómez | Informe spam
Resulta que cuando hago una actualización con parámetros a una base de datos
Access, si el campo que se va a actualizar es de tipo numérico decimal o
doble (en access), al valor que le envío a access, si tiene coma (separador
decimal) no lo vee:

Si le envío el valor 3,14 en access se guarda 314

Por descontado que el valor que le envío es del tipo correcto.

Alguien sabe como solucionar esto.

Los valores que hay en el objeto Command son:

miComando  {System.Data.OleDb.OleDbCommand}
  CommandText  "UPDATE Clientes SET IdDatoPersonal=?,
   Contacto=? , Saldo=?, TotalVenta=?,
   Descuento=?, Habilitado=? WHERE Id=?"
  CommandTimeOut 30
  CommandType  Text
  Connection  {System.Data.Oledb.OleDbConnection}
  Container  Nothing
  DesignTimeVisible True
  Parameters  {System.Data.Oledb.OleDbParameterCollection}
    Count  7
    Item(0)
      DbType  Int32
      Direction  Input
      IsNullable False
      OledbType  Integer
      ParameterName "IdDatoPersonal"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "IdDatoPersonal"
      SourceVersion Current
      Value  1{Integer}
    Item(1)
      DbType  AnsiString
      Direction  Input
      IsNullable False
      OledbType  VarChar
      ParameterName "Contacto"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "Contacto"
      SourceVersion Current
      Value  "Carlos"{String}
    Item(2)              >Aquí empiezan los problemas
      DbType  Decimal  
      Direction  Input
      IsNullable False
      OledbType  Decimal
      ParameterName "Saldo"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "Saldo"
      SourceVersion Current
      Value  12D{Decimal}   El valor es el que introduje
    Item(3)
      DbType  Decimal
      Direction  Input
      IsNullable False
      OledbType  Decimal
      ParameterName "TotalVenta"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "TotalVenta"
      SourceVersion Current
      Value  12.12{Decimal} El valor es el que introduje
    Item(4)
      DbType  Decimal
      Direction  Input
      IsNullable False
      OledbType  Decimal
      ParameterName "Descuento"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "Descuento"
      SourceVersion Current
      Value  12000.12D{Decimal} El valor es el que introduje
    Item(5)
      DbType  Boolean
      Direction  Input
      IsNullable False
      OledbType  Boolean
      ParameterName "Habilitado"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "Habilitado"
      SourceVersion Current
      Value  True{Boolean}
    Item(6)
      DbType  Int32
      Direction  Input
      IsNullable False
      OledbType  Integer
      ParameterName "Id"
      Precision  0
      Scale  0
      Size  0
      SourceColumn "Id"
      SourceVersion Current
      Value  1{Integer}
  Site   Nothing
  Transaction  {System.Data.OleDb.OleDbTransaction}
  UpdatedRowSource Both


Los valores que se aparecen en access son:
Id:  1
IdDatoPersonal: 1
Contacto: Carlos
Saldo  12
TotalVenta 1212   ->En vez de 12,12
Descuento 1200012 ->En vez de 12000,12
Habilitado True (casilla marcada)

Tanto en saldo,totalVenta y Descuento tengo en diseño:

Tipo    Número
Tamaño del campo Decimal
Precision  18
Escala   2
Lugares Decimales 2
 

Leer las respuestas

#1 Julio Casal
26/07/2005 - 03:47 | Informe spam
Hola Carlos. A mi una vez me pasó algo similar. El tema es que tu motor de BD
solo está preparado para manejar los decimales en el formato que usa un punto
"." como separador de decimales. Entonces, antes de tomar los datos de la UI
para enviarlos a grabar, puedes ejecutar algo como lo siguiente:

CultureInfo nuevaCultura = (CultureInfo)CultureInfo.CurrentCulture.Clone();
nuevaCultura.NumberFormat.CurrencyDecimalSeparator = ".";
nuevaCultura.NumberFormat.NumberDecimalSeparator = ".";
Thread.CurrentThread.CurrentCulture = nuevaCultura;

Con eso habrás cambiado momentáneamente la cultura de tu PC para que use "."
en lugar de "," para separar los decimales. Luego de eso, manda a actualizar
los datos y acto seguido reversa la cultura usando el mismo procedimiento,
pero esta vez devolviendo el separador de decimales a su estado original.

Espero haber podido ayudarte.

Saludos.

Julio Casal
.Net Solution Developer
MCAD
Grupo Lebed


"Carlos Gómez" wrote:

Resulta que cuando hago una actualización con parámetros a una base de datos
Access, si el campo que se va a actualizar es de tipo numérico decimal o
doble (en access), al valor que le envío a access, si tiene coma (separador
decimal) no lo vee:

Si le envío el valor 3,14 en access se guarda 314

Por descontado que el valor que le envío es del tipo correcto.

Alguien sabe como solucionar esto.

Los valores que hay en el objeto Command son:

miComando {System.Data.OleDb.OleDbCommand}
CommandText "UPDATE Clientes SET IdDatoPersonal=?,
Contacto=? , Saldo=?, TotalVenta=?,
Descuento=?, Habilitado=? WHERE Id=?"
CommandTimeOut 30
CommandType Text
Connection {System.Data.Oledb.OleDbConnection}
Container Nothing
DesignTimeVisible True
Parameters {System.Data.Oledb.OleDbParameterCollection}
Count 7
Item(0)
DbType Int32
Direction Input
IsNullable False
OledbType Integer
ParameterName "IdDatoPersonal"
Precision 0
Scale 0
Size 0
SourceColumn "IdDatoPersonal"
SourceVersion Current
Value 1{Integer}
Item(1)
DbType AnsiString
Direction Input
IsNullable False
OledbType VarChar
ParameterName "Contacto"
Precision 0
Scale 0
Size 0
SourceColumn "Contacto"
SourceVersion Current
Value "Carlos"{String}
Item(2) >Aquí empiezan los problemas
DbType Decimal
Direction Input
IsNullable False
OledbType Decimal
ParameterName "Saldo"
Precision 0
Scale 0
Size 0
SourceColumn "Saldo"
SourceVersion Current
Value 12D{Decimal} El valor es el que introduje
Item(3)
DbType Decimal
Direction Input
IsNullable False
OledbType Decimal
ParameterName "TotalVenta"
Precision 0
Scale 0
Size 0
SourceColumn "TotalVenta"
SourceVersion Current
Value 12.12{Decimal} El valor es el que introduje
Item(4)
DbType Decimal
Direction Input
IsNullable False
OledbType Decimal
ParameterName "Descuento"
Precision 0
Scale 0
Size 0
SourceColumn "Descuento"
SourceVersion Current
Value 12000.12D{Decimal} El valor es el que introduje
Item(5)
DbType Boolean
Direction Input
IsNullable False
OledbType Boolean
ParameterName "Habilitado"
Precision 0
Scale 0
Size 0
SourceColumn "Habilitado"
SourceVersion Current
Value True{Boolean}
Item(6)
DbType Int32
Direction Input
IsNullable False
OledbType Integer
ParameterName "Id"
Precision 0
Scale 0
Size 0
SourceColumn "Id"
SourceVersion Current
Value 1{Integer}
Site Nothing
Transaction {System.Data.OleDb.OleDbTransaction}
UpdatedRowSource Both


Los valores que se aparecen en access son:
Id: 1
IdDatoPersonal: 1
Contacto: Carlos
Saldo 12
TotalVenta 1212 ->En vez de 12,12
Descuento 1200012 ->En vez de 12000,12
Habilitado True (casilla marcada)

Tanto en saldo,totalVenta y Descuento tengo en diseño:

Tipo Número
Tamaño del campo Decimal
Precision 18
Escala 2
Lugares Decimales 2

Preguntas similares