2012-03-20 25 views
0

我可以看到很多話題,但沒有解決我的問題。訪問2007年和存儲十進制值

我來自斯洛文尼亞。我使用Access 2007的英文版。 使用c#。

我的語言環境設置全部設置爲斯洛文尼亞語。

我有一個帶有十進制列的訪問數據庫。 當我嘗試將5,4保存到其中時,它會忽略並存儲54。如果我嘗試存儲5.4,它也會忽略。並存儲54

我正在使用數據表來操作代碼中的數據。

public static DataSet DbData; 
public static DataRow DbRow; 

我曾嘗試以下解決方案,他們沒有工作,(總是使用5,4輸入):

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

我還能試試嗎?

編輯: 另外,如果我嘗試直接訪問運行該SQL語句:

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

我得到的語法錯誤的語句

但它的工作原理:

UPDATE Sifrant 
SET cena = 1.1 
WHERE ID = 2; 

在打開的accdb文件的GUI中,十進制分隔符是可見的。

+0

現在唯一的選擇可行正在轉向小數列成文本列,然後從字符串解析代碼爲十進制。但我想避免這種情況.. – SubjectX 2012-03-20 18:42:04

回答

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

是的,這將是一個解決方案,但我有很多東西要同時放入數據庫,並且編寫SQL語句對我來說有點沉悶.. – SubjectX 2012-03-22 23:51:11

0

不幸的是,Decimal字段在Access中有許多問題,一般建議使用not to use them
OleDB與驅動程序的對話似乎有一個潛在的錯誤。

經過一些測試,我可以複製你的問題。
這裏有幾個解決方案:

  1. 你確定你需要在你的數據庫中的小數場?
    看起來很愚蠢,但你是否100%確定你需要存儲在數據庫中的值的範圍真的保證Decimal而不是簡單的Double而不是?
    只需在Access中更改數據庫字段的數字類型(如果不需要); 真的需要十進制類型。

  2. 使用OleDbType.DoubleOleDbType.Currency
    當定義OldDbParameter該字段,使用OledDbType.DoubleOledDbType.Currency代替OledDbType.Decimal
    雖然保存的值可能會四捨五入,但如果您需要超出.Net爲這些類型提供的精度,請仔細測試。

產生額外的測試:

  • 我也試圖執行的線程的文化轉變爲en-US或使用不變的文化,但它不工作,這個問題確實出現在.Net與Jet/Ace數據庫引擎進行更新的方式之間存在特定的不匹配。
  • 我嘗試使用Odbc而不是OleDb,但使用OdbcType.Decimal時出現錯誤ERROR [07006] [Microsoft][ODBC Microsoft Access Driver]Restricted data type attribute violation

測試代碼:

我創建與表myTest,其具有3個字段的Access Database1.accdb

  • 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

將嘗試使用雙明天,將報告進度:D – SubjectX 2012-03-22 23:50:29