我使用以下代码将一些数据插入数据库:
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
),则在调试和发布后,它可以正常运行。
这怎么可能????
数据库中的数据类型为numeric
,Sample.MassOff
的数据类型为string
。
如果我能提供更多细节,请告诉我。
答案 0 :(得分:1)
我有类似的问题。我通过十进制值。问题在于解析分隔符点/逗号。整件事情一团糟......我最后将它加密成一个来回的字符串表示:)
答案 1 :(得分:1)
系统文化必须是一个问题。确保您的开发系统和部署系统的文化是相同的。
如果您无法控制/更改部署系统的文化,您可以将应用程序的文化设置如下:
在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>
如果您使用的是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