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:

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

Respuesta Responder a este mensaje
#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.
Respuesta Responder a este mensaje
#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:

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.


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida