vb.net – Access数据库无法正确保存十进制值
我在尝试在Access数据库的表中保存十进制值时遇到一些问题.
如果我键入值,没有问题,但是当我尝试使用我的程序保存它们时,数据库将不会保存小数并删除,(8,7转为87). 表中的字段是Decimal,Scale 2,Precision 8和Decimal places 2. 我正在使用此代码插入数据: Dim price as Decimal ProductsTableAdapter.Insert(id,name,price) 我试图把价格定为双倍,我仍然有同样的问题. 我已经查看了许多地方,并阅读有关将Access DB上的数据类型更改为Double但它不起作用. 任何想法,将不胜感激! 编辑: 正如cybermonkey所说,十进制值是8,7所以我试图用这种方式改变它. 我更改了代码以替换为.: Dim price2 As String price2 = price.ToString.Replace(",",".") ProductTableAdapter.Insert(id,price2) 价格2是8.7,但数据库再次显示87,00 编辑2: 我试图用另一个数据库创建另一个项目来确定问题是否是这个特定的适配器,但我又遇到了同样的问题. 之后,我调试程序以查看十进制值的存储方式,并且是:8,7而不是8.7.然后我尝试在数据库上插入数据,如果你把它放在8.7或8,7,它可以正常使用这两个值,所以现在我没有任何其他想法为什么这不起作用.
我已经能够重现这个问题.在Windows系统区域设置不使用句点字符(.)作为小数符号的计算机上运行时,它似乎是Access OLEDB提供程序的“不幸功能”.
使用以下代码 Dim price As Decimal = Convert.ToDecimal("8,7") Dim sb As New System.Text.StringBuilder("""price"" is a ") sb.Append(price.GetType.FullName) sb.Append(" whose value is ") If price < 1 Or price > 10 Then sb.Append("NOT ") End If sb.Append("between 1 and 10.") Debug.Print(sb.ToString) ProductsTableAdapter.Insert("myProduct",price) 当我运行Windows设置为“英语(美国)”时,我看到调试输出 "price" is a System.Decimal whose value is NOT between 1 and 10. 并且值87被插入到数据库中,因为字符串“8,7”不是该语言环境中的有效小数. Windows设置为“西班牙语(西班牙)”,现在生成相同的代码 "price" is a System.Decimal whose value is between 1 and 10. 但值87仍然插入. 将Windows设置为“French(Canada)”时,调试输出是相同的 "price" is a System.Decimal whose value is between 1 and 10. 但是,插入失败,“条件表达式中的数据类型不匹配”. 通过替换实现了完全相同的结果 ProductsTableAdapter.Insert("myProduct",price) 同 Dim myConnStr As String myConnStr = "Provider=Microsoft.ACE.OLEDB.12.0;" & "Data Source=C:UsersPublicDatabase1.accdb" Using con As New OleDbConnection(myConnStr) con.Open() Using cmd As New OleDbCommand("INSERT INTO Products ([name],price) VALUES (?,?)",con) cmd.Parameters.AddWithValue("?","oledbTest") cmd.Parameters.AddWithValue("?",price) cmd.ExecuteNonQuery() End Using End Using 证明这是System.Data.OleDb和Access OLEDB提供程序之间的问题,而不仅仅是TableAdapter的特性.但是,TableAdapters似乎完全依赖于OleDb,所以不幸的是它们可能在这些条件下无法工作. 好消息是,简单地将OleDb代码转换为Odbc似乎解决了“西班牙语(西班牙)”和“法语(加拿大)”Windows语言环境的问题 Dim myConnStr As String myConnStr = "Driver={Microsoft Access Driver (*.mdb,*.accdb)};" & "DBQ=C:UsersPublicDatabase1.accdb" Using con As New OdbcConnection(myConnStr) con.Open() Using cmd As New OdbcCommand("INSERT INTO Products ([name],"odbcTest") cmd.Parameters.AddWithValue("?",price) cmd.ExecuteNonQuery() End Using End Using 所以一种可能的解决方法可能是使用OdbcDataAdapter而不是TableAdapter. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |