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

Preguntas similare

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:

Mostrar la cita
#2 Carlos Gómez
26/07/2005 - 17:33 | Informe spam
No ha funcionado. Al final lo he resuelto de la siguiente forma:

Cuando indico el tipo de dato que le paso en el parámetro,
en vez de decirle que el OldDbType.Decimal, le digo que es
OleDbType.VarChar:

Dim parametro As New OleDbParameter
parametro.ParameterName="Saldo"
parametro.SourceColumn="Saldo"
parametro.OleDbType=OleDbType.VarChar < Aquí
objetoComando.Parameters.Add(parametro)

Me parece una chapuza de cojones, pero es la única forma con
la que ha funcionado.
#3 Julio Casal
27/07/2005 - 07:18 | Informe spam
Bueno, no es la solución ideal, pero que bueno que te haya servido para salir
de tu apuro. Sin embargo, te recomendaría pruebes tu aplicación con
diferentes configuraciones regionales del equipo. Al menos pruébala con tu
configuración regional señalando el "." como separador de decimales y luego
pruébala con tu configuración señalando la coma "," como separador de
decimales.

Justo hoy tuve un caso en el que, por enviar todo como varchar, pues los
datos simplemente llegaban mal formateados a SQL Server.

Saludos.

Julio Casal
.Net Solution Developer
MCAD
Grupo Lebed


"Carlos Gómez" wrote:

Mostrar la cita
Ads by Google
Search Busqueda sugerida