【问题标题】:How do I read asterisk (***) fields from .DBF data base?如何从 .DBF 数据库中读取星号 (***) 字段?
【发布时间】:2015-03-22 00:50:48
【问题描述】:

我正在尝试使用 VB.NET 读取 .DBF 数据库...代码一直在工作,直到我到达其中一个表上的列,该列应该是十进制但它却用星号填充。

我正在使用的连接字符串和阅读器是这样的:

Using SDBconnection As New OleDbConnection("User ID=;" & _
                                                    "DSN=;" & _
                                                    "Cache Authentication=False;" & _
                                                    "Data Source=""" & TextBox_DBLoc.Text & """;" & _
                                                    "Provider=""VFPOLEDB"";" & _
                                                    "Collating Sequence=MACHINE;" & _
                                                    "Mask Password=False;" & _
                                                    "persist security info=False;" & _
                                                    "Mode=Share Deny None;" & _
                                                    "Extended Properties=;" & _
                                                    "Encrypt Password=False")

Dim oleReader As OleDbDataReader = New OleDbCommand("Select * from " & table, SDBconnection).ExecuteReader()

有什么方法可以在数据类型不对应时进行评估,然后再进行强制转换或类似的事情?

该表格在其他DBF阅读器软件中可以读取,读取时不会显示错误。我该怎么做?

编辑: 我的代码到达带星号的列时抛出的错误消息是这样的:

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

【问题讨论】:

  • 您在哪里显示数据,您在哪里看到该字段用星号填充?这不是数据的问题;无论您以何种方式显示它都是一个问题,因为该表格在其他 DBF 阅读器软件中是可读的。它也是你的可读;你只是显示错了。
  • 首先,我只是将表格转换为 csv 文件,当我读取填充有 *** 的列时会抛出“提供程序无法确定十进制值。例如,该行刚刚创建,Decimal 列的默认值不可用,消费者尚未设置新的 Decimal 值。”
  • 我用我下载的名为 DBF Viewer 2000 的软件打开表格看到了星号,在那里我可以毫无问题地打开表格。

标签: vb.net dbf visual-foxpro


【解决方案1】:

Visual Foxpro 存在一个问题,它显然允许用户在数字字段中输入溢出的值,这似乎不会在 Visual Foxpro 中引起问题。但是,当使用 Visual Foxpro 以外的任何工具访问数据时,它确实会导致问题,因为它违反了该字段的设置。 VFPOLEDB 将这些值作为星号返回。 作为一种解决方法,您可以尝试以下查询:

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

这会将十进制列 (SaleAmt) 转换为字符串,然后再转换回数值。

您还可以检查数据是否存在溢出值并修改 dbf 表结构来解决此问题。

This link explains this problem

【讨论】:

  • 我已经多次看到这个答案,但是如果我想阅读整个表格列,而不仅仅是使用通配符“*”的 SaleAmt(参考您的示例)怎么办?
  • 那你应该修改dbf表结构,增加数值字段的大小。使用通配符会触发错误。
  • 我明白了......好吧,因为在我的情况下这不是一个选项,我想我必须明确地调用每一列。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多