데이터베이스는 실제 10 진수 값을 허용하지 않습니다.

asp.net-mvc c# dapper ms-access

문제

일부 데이터를 데이터베이스에 삽입하려면 다음 코드를 사용합니다.

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 의 값이 10 진수 형식 (예 : 1.6 ) 인 경우에만 발생합니다.

이 값을 정수 (예 : 5 )로 전달하면 디버깅 할 때와 게시 한 후에도 문제없이 작동합니다.

이것이 어떻게 가능한지????

데이터베이스의 데이터 유형은 numeric 이며 Sample.MassOff 의 데이터 유형은 string 입니다.

더 자세한 정보를 제공 할 수 있는지 알려주세요.

수락 된 답변

다음을 수행하여이 문제를 해결할 수있었습니다.

  • MassOff 의 데이터 유형을 double 변경
  • 라인을 추가 <globalization uiCulture="en" culture="en-US" />web.config

인기 답변

시스템의 문화가 여기에 문제가되어야합니다. 개발 시스템의 문화와 배포 시스템이 동일한 지 확인하십시오.

배포 시스템의 culture를 제어 / 변경할 수없는 경우 아래와 같이 응용 프로그램의 Culture를 설정할 수 있습니다.

웹 응용 프로그램 (귀하의 경우)

web.config 에서 globalization 속성 설정

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

응용 프로그램을 시작할 때 위의 코드를 호출하십시오.



아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.
아래 라이선스: CC-BY-SA with attribution
와 제휴하지 않음 Stack Overflow
이 KB는 합법적입니까? 예, 이유를 알아보십시오.