数据库不接受现场
十进制值我使用下面的代码位的一些数据插入到数据库:数据库不接受现场
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.MassOff
为string
。
让我知道,如果我可以提供任何更多的细节。
我能够通过执行以下操作来解决此问题:
- 改变的
MassOff
的数据类型double
- 添加行
<globalization uiCulture="en" culture="en-US" />
到web.config
我有类似的问题。我通过了十进制值。问题在于解析分隔符点/逗号。整件事情是一团糟......我只是最终把它加密成一个字符串表示来回:) :)
您是否也仅在服务器上坐着时遇到过这种情况?我试着在'MassOff'上调用'Replace(',','。');'但是得到了同样的错误 – Bassie
它没有经过开发测试,所以没有。但是一些古鲁认为它必须做一些文化不变的特征。但我不敢说它和你的情况一样。 –
系统的文化必须是一个问题在这里。确保您的开发系统和部署系统的文化是相同的。
如果你无法控制/更改部署系统的文化,你可以设置你的应用程序,如下的文化:在
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 });
拨打上面的代码在你的应用程序的开始。
正如在我的答案中所见,我相信这是这种结合和我使用不正确的数据类型 – Bassie
什么样库的扩展了经典使用Execute方法的OleDbException?你在使用Dapper吗? – Steve
Access甚至**是否具有**数字型数据类型? – stuartd
@Steve道歉,史蒂夫,是的,它是精巧的。 @stuartd我认为它可能被称为'号码' – Bassie