数据库不接受实时的十进制值

时间:2017-06-07 14:51:20

标签: c# asp.net-mvc ms-access dapper

我使用以下代码将一些数据插入数据库:

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

当我通过Visual Studio在本地运行它时,它工作正常。

但是,当我发布网站并尝试插入时,我收到错误:

  

条件表达式中的数据类型不匹配。

堆栈跟踪

[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

但只有在Sample.MassOff的值为十进制格式(例如1.6)时才会发生这种情况。

如果此值作为整数传递(例如5),则在调试和发布后,它可以正常运行。

这怎么可能????

数据库中的数据类型为numericSample.MassOff的数据类型为string

如果我能提供更多细节,请告诉我。

3 个答案:

答案 0 :(得分:1)

我有类似的问题。我通过十进制值。问题在于解析分隔符点/逗号。整件事情一团糟......我最后将它加密成一个来回的字符串表示:)

答案 1 :(得分:1)

系统文化必须是一个问题。确保您的开发系统和部署系统的文化是相同的。

如果您无法控制/更改部署系统的文化,您可以将应用程序的文化设置如下:

Web应用程序(您的案例)

globalization

中设置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>

Windows应用程序(可能对其他人有帮助)

如果您使用的是DotNet Framework 4.5,请执行以下操作:

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;

如果您使用的是DotNet Framework 4或更早版本,请遵循以下步骤:

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 });

在应用程序开始时调用上面的代码。

答案 2 :(得分:1)

我能够通过以下方式解决这个问题:

  • MassOff的数据类型更改为double
  • 将行<globalization uiCulture="en" culture="en-US" />添加到web.config