La base de datos no acepta valores decimales en vivo

asp.net-mvc c# dapper ms-access

Pregunta

Estoy usando el siguiente bit de código para insertar algunos datos en una base de datos:

internal int InsertSample(Sample sample)
{
    using (var db = new OleDbConnection(connectionString))
    {
        var query = Constants.InsertNewSample;
        return db.Execute(query, sample);
    }
}

Y funciona bien cuando lo ejecuto localmente a través de Visual Studio.

Sin embargo, cuando publico el sitio e intento insertarlo, aparece un error:

Tipo de datos no coincide en la expresión de criterios.

Seguimiento de pila

[OleDbException (0x80040e07): Data type mismatch in criteria expression.]
   System.Data.OleDb.OleDbCommand.ExecuteCommandTextErrorHandling(OleDbHResult hr) +1138392
   System.Data.OleDb.OleDbCommand.ExecuteCommandTextForSingleResult(tagDBPARAMS dbParams, Object& executeResult) +247
   System.Data.OleDb.OleDbCommand.ExecuteCommandText(Object& executeResult) +208
   System.Data.OleDb.OleDbCommand.ExecuteCommand(CommandBehavior behavior, Object& executeResult) +58
   System.Data.OleDb.OleDbCommand.ExecuteReaderInternal(CommandBehavior behavior, String method) +162
   System.Data.OleDb.OleDbCommand.ExecuteNonQuery() +107
   Dapper.SqlMapper.ExecuteCommand(IDbConnection cnn, CommandDefinition& command, Action`2 paramReader) +93
   Dapper.SqlMapper.ExecuteImpl(IDbConnection cnn, CommandDefinition& command) +758
   MVCQCPage.Helpers.Access.InsertSample(Sample sample) +208

Pero esto solo sucede si el valor de Sample.MassOff está en formato decimal (por ejemplo, 1.6 ).

Si este valor se pasa como un entero (por ejemplo, 5 ), funciona sin problemas cuando se depura y después de la publicación.

¿¿¿¿Cómo es esto posible????

El tipo de datos en la base de datos es numeric , y el tipo de datos de Sample.MassOff es string .

Avíseme si puedo proporcionar más detalles.

Respuesta aceptada

Pude resolver esto haciendo lo siguiente:

  • Cambiar el tipo de datos de MassOff para double
  • Agregar la línea <globalization uiCulture="en" culture="en-US" /> a web.config

Respuesta popular

La cultura del sistema debe ser un problema aquí. Asegúrese de que Cultura de su sistema de desarrollo y sistema de implementación sea el mismo.

Si no puede controlar / cambiar el sistema de Culture of deployment, puede establecer Culture de su aplicación de la siguiente manera:

Aplicación web (su caso)

Establecer el atributo de globalization en web.config

<configuration>
    <system.web>
        <globalization culture="en-US" uiCulture="en-US" />/*Whatever your default culture you want to use irrespective of system*/
    </system.web>
</configuration>

Aplicación de Windows (puede ser útil para otros)

Si está utilizando DotNet Framework 4.5, lo siguiente será:

CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("en-US");//Whatever your default culture you want to use irrespective of system
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;
CultureInfo.DefaultThreadCurrentCulture = cultureInfo;
CultureInfo.DefaultThreadCurrentUICulture = cultureInfo;

Si está utilizando DotNet Framework 4 o anterior, el siguiente es el truco:

CultureInfo cultureInfo = CultureInfo.CreateSpecificCulture("en-US");//Whatever your default culture you want to use irrespective of system
Thread.CurrentThread.CurrentCulture = cultureInfo;
Thread.CurrentThread.CurrentUICulture = cultureInfo;

Type type = typeof(CultureInfo);
type.InvokeMember("s_userDefaultCulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

type.InvokeMember("s_userDefaultUICulture",
                    BindingFlags.SetField | BindingFlags.NonPublic | BindingFlags.Static,
                    null,
                    cultureInfo,
                    new object[] { cultureInfo });

Llame al código anterior al inicio de su aplicación.



Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué