vb.net – Access数据库无法正确保存十进制值

前端之家收集整理的这篇文章主要介绍了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:\Users\Public\Database1.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:\Users\Public\Database1.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.

猜你在找的VB相关文章