【问题标题】:VB.NET - Visual Foxpro OLE DB Problem with Numeric Decimal ColumnVB.NET - 数字十进制列的 Visual Foxpro OLE DB 问题
【发布时间】:2011-06-30 05:49:06
【问题描述】:

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

提供程序无法确定十进制值。例如,刚刚创建的行,Decimal 列的默认值不是 可用,并且消费者尚未设置新的 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

【问题讨论】:

    标签: vb.net oledb foxpro visual-foxpro


    【解决方案1】:

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

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

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

    【讨论】:

    • 这个答案适用于我们大多数但不是全部This answer 处理所有列:CAST(FieldName As NUMERIC(11, 3))
    【解决方案2】:

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

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

    Visual Foxpro 软件显然允许用户在此字段中输入值 1000987,据我所知,这不会导致 Visual Foxpro 出现问题。但是,当使用 Visual Foxpro 以外的任何工具访问数据时,它确实会导致问题,因为它违反了该字段的设置。

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

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

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

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

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

    【讨论】:

      【解决方案3】:

      我通过 C# 和 VB 使用 VFP 处理了许多带/不带小数的表格,没有任何问题。至于数据的排序,您可以在 select 中添加“order by”子句,使其默认以预排序模式从 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 查看器实用程序中,表结构的输入掩码应默认为其预期值...浏览到任何记录,进入该字段并开始输入“9.99999”,因此“9 。”将强制你到它已知的小数位置,然后在小数点后继续输入 9,看看有多少实际位置可用。如果您尝试输入一个比其允许的小数精度更高的值,我可以看到它会如何困扰您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-09
        • 2021-07-23
        • 1970-01-01
        • 2020-09-21
        相关资源
        最近更新 更多