VB.NET - 带有数字十进制列的Visual Foxpro OLE DB问题

时间:2011-02-19 03:52:24

标签: vb.net oledb foxpro visual-foxpro

简而言之: 我正在使用VB.NET 2008使用vfpoledb.1驱动程序连接到Visual Foxpro 6数据库。当我尝试使用包含其中一个数字列的数据集表填充OleDbDataAdapter时,我收到以下错误消息:

  

提供商无法确定十进制值。例如,刚刚创建了行,Decimal列的默认值不是   可用,消费者尚未设置新的十进制值。

我想从VB.NET 2008中检索此列,并将其保存为数字格式。

长版:

我正在使用VB.NET连接到Visual Foxpro 6数据库。表中的几个列适用于最多8位数的数字数据类型。我不确定Visual Foxpro数据类型是如何工作的,但似乎该字段允许某人输入以下任何示例值:

99999999  
99999.99  
    9.99  
    9.00
{nothing} 

来自Visual Foxpro:我可以访问名为Foxwin的小程序,它允许我在本机VFP环境中浏览VFP表。这就是我用来访问数据以获取我上面发布的内容的示例。从这里我可以看到一些行在这个字段中根本不包含任何值,尽管它们在没有数据时似乎被填充空格。我试图运行更新查询以使用有效数据填充每一行但我的更新查询完成而不更新任何行。我已经尝试过ISNULL(bal_qty)和bal_qty IS NULL并且两者都无效。

从MS Access 2007:使用我在VB.NET中使用的相同驱动程序,我可以加载ADO记录集并将其绑定到表单没有问题。小数值似乎被剥离,可能是因为它们都是“.00”。我更喜欢在VB.NET中构建这个小程序,所以我只使用MS Access进行测试。

来自VB.NET:如果我将bal_qty转换为String,我的SQL语句会起作用,但这会导致排序问题。我已经尝试了VAL(STR(bal_qty))并且它失败并且我在上面发布了相同的错误消息。这是我正在使用的代码:

Imports System.Data.OleDb

Public Class Form1
    Dim sConString As String = "Provider=vfpoledb.1;Data Source=C:\MyDatabase.dbc;Mode=3;"
    Dim con As OleDbConnection = New OleDbConnection(sConString)

    Private Function FetchData()

        con.Open()
        Dim ds As DataSet = New DataSet()
        Dim sSQL As String
        'This SQL statement works but the data doesn't sort properly.
        'sSQL = "SELECT item_cd, item_desc, STR(bal_qty) FROM invent;"

        sSQL = "SELECT item_cd, item_desc, bal_qty FROM invent;"

        Dim cmd As OleDbCommand = New OleDbCommand(sSQL, con)
        Dim daInv As OleDbDataAdapter = New OleDbDataAdapter(cmd)
        Dim iRecCount As Integer
        iRecCount = daInv.Fill(ds, "invent") 'The error occurs here.
        Me.DataGridView1.DataSource = ds.Tables("invent").DefaultView
    End Function

    Private Sub btnFetchData_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnFetchData.Click
        Call FetchData()
    End Sub

    Private Sub Form1_FormClosing(ByVal sender As Object, ByVal e As System.Windows.Forms.FormClosingEventArgs) Handles Me.FormClosing
        con.Close()
        con = Nothing
    End Sub
End Class

3 个答案:

答案 0 :(得分:3)

我发现导致此问题的问题。在bal_qty列/字段中输入的数字数据不符合列的数据类型定义。

我的字段bal_qty有一个Visual Foxpro数据定义:
类型:数字
宽度:8
十进制:2

Visual Foxpro软件显然允许用户在此字段中输入值1000987,尽管我可以说,它不会在Visual Foxpro中引起问题。但是,当使用Visual Foxpro以外的任何内容访问数据时,它确实会导致问题,因为它违反了此字段的设置。

进一步测试显示MS Access 2007也存在此值的问题。将记录集加载到我的数据表视图表单后,我收到错误:“数据提供程序或其他服务返回E_FAIL状态。”如果我包含以下WHERE子句,我不会收到错误:WHERE bal_qty< 9999

我现在已经通过运行SQL UPDATE语句来解决问题,以更改违规记录中bal_qty的值。

我还在名为markup的列中发现了错误的数据。数百条记录只显示星号,它们应显示数字数据。在记录集查询中包含此标记列会导致我的查询失败并出现错误。

请参阅此SO帖子关于数字列中的星号以及如何从.NET处理它: How do I read asterisk (***) fields from .DBF data base?

如果您正在尝试解决此问题,可以使用Visual RunFox 6本机查看和编辑VFP数据,该文件在Ed Leafe的网站上免费提供:http://leafe.com/dls/vfp您也可以从此处编辑表格结构。除非您是经验丰富的VFP程序员,否则此工具远非直观。您必须从命令窗口输入您想要执行的大多数操作的VFP命令。

答案 1 :(得分:3)

我们在使用.NET应用程序时遇到此问题,该应用程序读取了foxpro dbf' s。我们的解决方案是在select语句中使用以下内容:

SELECT PropertyID, VAL(STR(SaleAmt)) as SaleAmt FROM MyTable

这会将十进制列(SaleAmt)转换为字符串,然后再返回数值。此外,如果需要整数,则可以在SELECT语句中使用INT(SaleAmt)。

答案 2 :(得分:1)

我通过C#和VB与VFP一起使用了许多带/不带小数的表而没有问题。至于数据的排序,您可以将“order by”子句添加到select中,使其默认从VFP向DOWN转换为VB,并进行预分类模式。

此外,在我构建的版本中,我不查询数据集,也不知道某处某处可能是某个问题......

dim dt as DataTable
dim sSQL as String
sSQL = "Select item_cd, item_desc, bal_qty from invent order by bal_qty"

then, your data adapter...

daInv.Fill( dt )

then you would still be able to bind directly to your grid...

Me.DataGridView1.DataSource = dt

对于数字内容,从您的DBF Viewer实用程序,表结构的输入掩码应默认为其预期值...浏览到任何记录,进入th字段并开始键入“9.99999”,所以“9 “。将强制您到IT已知的小数位,然后在小数点后输入9,看看有多少实际位置可用。如果你试图输入一个小于它允许的十进制精度值的值,我可以看到它会如何唠叨你。