2017-06-07 45 views
1

十进制值我使用下面的代码位的一些数据插入到数据库:数据库不接受现场

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

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

然而,当我发布网站,并尝试插入,我得到一个错误:

Data type mismatch in criteria expression.

堆栈跟踪

[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),那么在调试时和发布后它没有任何问题。

这是怎么回事?

数据库中的数据类型为numeric,数据类型为Sample.MassOffstring

让我知道,如果我可以提供任何更多的细节。

+1

什么样库的扩展了经典使用Execute方法的OleDbException?你在使用Dapper吗? – Steve

+0

Access甚至**是否具有**数字型数据类型? – stuartd

+0

@Steve道歉,史蒂夫,是的,它是精巧的。 @stuartd我认为它可能被称为'号码' – Bassie

回答

1

我能够通过执行以下操作来解决此问题:

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

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

+0

您是否也仅在服务器上坐着时遇到过这种情况?我试着在'MassOff'上调用'Replace(',','。');'但是得到了同样的错误 – Bassie

+0

它没有经过开发测试,所以没有。但是一些古鲁认为它必须做一些文化不变的特征。但我不敢说它和你的情况一样。 –

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的框架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 }); 

拨打上面的代码在你的应用程序的开始。

+0

正如在我的答案中所见,我相信这是这种结合和我使用不正确的数据类型 – Bassie