2012-03-20 3 views
0

많은 주제를 볼 수 있지만 내 문제는 해결되지 않았습니다.Access 2007 및 십진수 값 저장

저는 슬로베니아 출신입니다. 영어 버전의 Access 2007을 사용하고 있습니다. C#을 사용 중입니다.

내 로캘 설정이 모두 슬로베니아어로 설정되어 있습니다.

십진수 열이있는 액세스 데이터베이스가 있습니다. 5,4을 저장하려고하면 무시하고 54을 저장합니다. 5.4을 저장하려고하면 무시됩니다. 54을 저장합니다.

코드에서 데이터를 조작하기 위해 datatables를 사용하고 있습니다.

public static DataSet DbData; 
public static DataRow DbRow; 

내가 시도 다음과 같은 솔루션은 그들 중 누구도 (항상 입력 5,4 사용) 작동하지 :

DB에 저장되어있는 어떤
DbRow[6] = Convert.ToDecimal(txtNovCena.Text); // value of DbRow[6] is 5,4 
DbRow[6] = Decimal.Parse(txtNovCena.Text, new System.Globalization.CultureInfo("NL-nl").NumberFormat); // value of DbRow[6] is 5,4 
DbRow[6] = Decimal.Parse(txtNovCena.Text, new System.Globalization.CultureInfo("EN-us").NumberFormat); // value of DbRow[6] is 54 
DbRow[6] = Decimal.Parse(txtNovCena.Text, new System.Globalization.CultureInfo("sl-SI").NumberFormat); // value of DbRow[6] is 5,4 

DbRow[6] = txtNovCena.Text.Replace(",", "."); // value of DbRow[6] is 54 

DbAdapter.Update(DbData); 

항상 54입니다.

그 외 어떤 시도를 할 수 있습니까?

편집 : Access에서 직접 SQL 문을 실행하려고하면 또한, :

UPDATE Sifrant 
SET cena = 1,1 
WHERE ID = 2; 

나는 문

에 구문 오류가 발생하지만 작동 :

UPDATE Sifrant 
SET cena = 1.1 
WHERE ID = 2; 

소수점 구분 기호는 열린 accdb 파일의 GUI에서 볼 수 있습니다.

+0

을 이제 옵션이 가능한 텍스트 컬럼에 소수점 열을 돌고 다음 코드에서 진수 문자열에서 구문 분석. 그러나 나는 이것을 피하고 싶습니다 .. – SubjectX

답변

0

나는 당신의 로케일과 관련이 없다고 생각합니다. "SET cena = 1,1 ..."은 어떤 로케일에 상관없이 Access (VBA)에서 작동하지 않습니다.

OleDb 클래스를 사용해보세요. 나는이 (매우 일반적인) 솔루션이 작동해야한다고 생각 :

private void UpdateRecord(string connectionString) 
{ 
    using (OleDbConnection connection = new OleDbConnection(connectionString)) 
    { 
     connection.Open(); 
     OleDbCommand command = new OleDbCommand("UPDATE Sifrant SET cena = 1.1 WHERE ID = 2", connection); 
     command.ExecuteNonQuery(); 
    } 
} 

그것은 당신이 찾고있는 정확하게되지 않을 수도 있습니다,하지만 당신은 다른 솔루션의 아이디어를 제공해야한다.

+0

그래, 그 해결책이 될 것이지만, 동시에 DB에 넣어 많은 것들이 있고, SQL 문을 쓰는 것은 나를 위해 조금 둔합니다. – SubjectX

0

불행히도 Decimal 필드에는 Access에서 여러 가지 문제가 있으며 일반적으로 not to use them을 권장합니다.
OleDB와 드라이버의 대화 방식에 근본적인 버그가있는 것 같습니다.

몇 가지 테스트를 마친 후에 문제를 재현 할 수 있습니다. 당신이 당신의 데이터베이스의 진수 필드를 필요로 확인

  1. 위치 : 여기
    솔루션의 몇입니까?
    바보 같지만 데이터베이스에 저장해야하는 값의 범위가 Decimal이고 실제로는 Double이 아니라는 것을 100 % 확신합니까?
    Don 필드에 데이터베이스 필드의 숫자 형식을 변경하면 이 실제로에 Decimal 형식이 필요합니다.

  2. 사용 OleDbType.Double 또는 OleDbType.Currency
    해당 필드에 대한 OldDbParameter을 정의 OledDbType.Double 또는 OledDbType.Currency 대신 OledDbType.Decimal를 사용합니다.
    저장된 값이 반올림 될 수 있으므로주의하십시오. 따라서 .Net이 이러한 유형에 제공하는 것 이상의 정밀도가 필요한 경우 철저히 테스트하십시오.

위한 추가적인 테스트 :

  • 가 나는 또한 EN-US로 실행 스레드의 문화를 변경하거나 고정 문화권을 사용하려고하지만, 그것이 작동하지 않는 문제가 나타나지 않습니다 .Net이 Jet/Ace 데이터베이스 엔진에 어떻게 업데이트되는지에 대한 구체적인 불일치가 될 수 있습니다.
  • OleDb 대신 Odbc를 사용했지만, OdbcType.Decimal을 사용할 때 ERROR [07006] [Microsoft][ODBC Microsoft Access Driver]Restricted data type attribute violation 오류가 발생했습니다.

시험 번호 :

는 I 3 개 필드가 테이블 myTest와 액세스 Database1.accdb 생성 : A의 소수로 정의

  • ID

    , 일련 번호
  • ValueDecimal, 정밀도 6
  • ValueDouble은 다음과 같이 정의됩니다.

더블 나는 테스트를 실행하기 전에 슬로베니아어에 내 Windows 국가 별 설정을 전환 :

static void tryoledb() { 
    var strAccessConn = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\Database1.accdb"; 
    string strAccessSelect = "SELECT * FROM myTest"; 

    DataSet myDataSet = new DataSet(); 
    OleDbConnection myAccessConn = null; 
    myAccessConn = new OleDbConnection(strAccessConn); 
    OleDbCommand myAccessCommand = new OleDbCommand(strAccessSelect, myAccessConn); 
    OleDbDataAdapter myDataAdapter = new OleDbDataAdapter(myAccessCommand); 

    myAccessConn.Open(); 
    myDataAdapter.Fill(myDataSet, "myTest"); 

    var mytable = myDataSet.Tables["myTest"]; 
    DataRowCollection dra = mytable.Rows; 

    // Set the field ValueDecimal 
    dra[0][1] = 5.4; 
    dra[1][1] = 5.4m; 
    dra[2][1] = decimal.Parse("5.4"); 
    dra[3][1] = decimal.Parse("5,4"); 

    // Set the field ValueDouble 
    dra[0][2] = 5.4; 
    dra[1][2] = 5.4m; 
    dra[2][2] = double.Parse("5.4"); 
    dra[3][2] = double.Parse("5,4"); 

    var command = new OleDbCommand("UPDATE myTest SET ValueDecimal = ?, ValueDouble = ? WHERE ID = ?", myAccessConn); 
    var p = command.Parameters.Add("ValueDecimal", OleDbType.Decimal); // Change to OldDbType.Double to make it work 
    p.SourceColumn = "ValueDecimal"; 
    p.SourceVersion = DataRowVersion.Current; 

    p = command.Parameters.Add("ValueDouble", OleDbType.Double); 
    p.SourceColumn = "ValueDouble"; 
    p.SourceVersion = DataRowVersion.Current; 

    p = command.Parameters.Add("ID", OleDbType.Integer); 
    p.SourceColumn = "ID"; 
    p.SourceVersion = DataRowVersion.Original; 

    myDataAdapter.UpdateCommand = command; 
    myDataAdapter.Update(mytable); 
    myAccessConn.Close(); 
} 
+0

하려고합니다 더블 tommorow를 사용하여 진행 상황을보고합니다 : D – SubjectX