使用 VFP OLE DB 提供程序,通过 VB .NET 在 Visual FoxPro 表中查找值或其最接近的匹配项。

本文介绍如何使用 VFP OLE DB 提供程序从 VB .NET 中在 Visual FoxPro 表格中定位一个值或最接近的匹配项。

原始产品版本: Visual FoxPro
原始 KB 数: 956277

快速发布

快速发布文章从微软支持团队内直接提供信息。 本文中包含的信息是针对新兴或独特的主题创建的,或旨在补充其他知识库信息。

行动

你有一个 Visual FoxPro(VFP)表,可通过 VFP OLE DB 提供程序从 Visual Basic .NET 访问。 你想要在列中查找特定值或最近的匹配项。

决议

VFP SET NEAR 命令用于控制在 SEEK(或 FIND)操作失败后,VFP 表中的记录指针应如何变动(SEEK 利用 VFP 列的索引来定位值)。 当 NEAR 打开时,VFP 表中的记录指针定位在查找不成功后最接近匹配的记录。

以下 VB .NET 代码演示如何通过 VFP OLE DB 提供程序查找记录或最接近的匹配项。 若要使用此代码...

  1. 使用以下 VFP 代码创建示例 VFP 表和索引:

    CLOSE DATA ALL
    DELETE FILE C:\CUSTS.DBF RECYCLE
    DELETE FILE C:\CUSTS.CDX RECYCLE
    CREATE TABLE C:\CUSTS (NAMES VarChar(30))
    INDEX ON UPPER(NAMES) TAG NAMES
    INSERT INTO CUSTS VALUES('FRED')
    INSERT INTO CUSTS VALUES('JOHN')
    INSERT INTO CUSTS VALUES('MARY')
    CLOSE DATA ALL
    
  2. 创建新的 Visual Studio VB .NET Windows 应用程序。 删除窗体上的 TextBox、CheckBox 和按钮。

  3. 双击窗体图面以打开代码编辑器(form1.vb),然后将下面的代码粘贴到其中,替换当前内容。

该代码执行以下操作:

  • 根据 VB 窗体上 CheckBox 的状态,设置为 ON 或 OFF(选中时为 ON)。
  • 打开免费的 VFP 表(C:\CUSTS),并查看客户名称。
  • 在 VFP OLE DB 提供程序中创建游标,以将其返回到 .NET 会话。
  • 将返回游标填充为 FOUND()RECNO('CUSTS')RECCOUNT('CUSTS') 的值。
  • 使用 VFP 函数将 VFP SETRESULTSET() 游标返回到 .NET。
  • VB .NET 使用对象 OleDbDataReader 读取返回的游标并在其中 MSGBOX显示 SEEK 的结果。

注意

  • 当 VFP SEEK 找到完全匹配项时,FOUND()(结果集中的第一列)为真。 可以忽略其他列。

  • 当 VFP SEEK 找不到 完全匹配项且 NEAR 为 ON 时, FOUND() (结果集中的第一列)为 False ,并且 RECNO() (结果集中的第二列)为有效数字,或者将是 RECCOUNT() (结果集中的第三列)+1(表示 VFP 表中的 EOF)。

  • 当 VFP SEEK 找不到 完全匹配并且 NEAR 为 OFF 时,FOUND() 将为 .F.,RECNO() 将为 RECCOUNT() + 1。

  • 结果集中的第三列是常量: RECCOUNT('CUSTS')。 使用此功能确定当 NEAR 开启时您是否在最近的记录上(即第 2 列不等于第 3 列加1)。

Imports System.Data.OleDb
Imports System.Text

Public Class Form1
    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        TextBox1.Focus()
        TextBox1.Text = "JOHN"
        TextBox1.CharacterCasing = CharacterCasing.Upper
    End Sub

    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        FindOperator(TextBox1.Text, CheckBox1.Checked)
        TextBox1.Focus()
    End Sub
    Function FindOperator(ByVal Name2Find As String, ByVal Near As Boolean) As VariantType
        Dim oConn As New OleDbConnection( _"Provider=VFPOLEDB;Data Source=C:\")
        Dim oCmd As New OleDbCommand("", oConn)
        Dim oStrBldr As New StringBuilder
        Dim oReader As OleDbDataReader
        Dim lcNear As String = IIf(Near, "ON", "OFF")

        With oStrBldr
        .Append("EXECS(").Append("[SET NEAR " & lcNear & "] + CHR(13) + ").Append("[USE CUSTS ORDER NAMES SHARED AGAIN IN 0] + CHR(13) + ").Append("[SEEK '" & Name2Find & "' IN CUSTS] + CHR(13) + ").Append("[SELECT 0] + CHR(13) + ").Append("[CREATE CURSOR SeekResults(lFound L, nRecno I, nReccount I)] + CHR(13) + ").Append("[INSERT INTO SeekResults VALUES ( FOUND('CUSTS'), RECNO('CUSTS'), RECCOUNT('CUSTS'))]+ CHR(13) + ").Append("[USE IN SELECT('CUSTS')] + CHR(13) + ").Append("[RETURN SETRESULTSET( 'SeekResults' )]").Append(")")
        oCmd.CommandText = .ToString
        End With

        oConn.Open()
        oReader = oCmd.ExecuteReader()
        While oReader.Read
        MsgBox("Found: " & oReader.GetBoolean(0).ToString & vbCrLf & _
        "RECNO(): " & oReader.GetInt32(1).ToString & vbCrLf & _
        "RECCOUNT(): " & oReader.GetInt32(2).ToString)
        End While

        oConn.Close()
        oConn.Dispose()
        oCmd.Dispose()
        oReader.Close()
    End Function
End Class

详细信息

有关本文中使用的 VFP 函数和命令的详细信息(SEEK、SET NEAR、RECNO()、RECCOUNT()、SELECT()、SETRESULTSET()等),请参阅 Microsoft Visual FoxPro 9.0 SP2

VFP OLE DB 提供程序作为免费下载提供,是从非 VFP 应用程序访问 VFP 数据的首选方法。 这里提供 Microsoft Visual FoxPro 9.0 的 OLE DB 提供程序。

免責聲明

MICROSOFT和/或其供应商对网站(“材料”)上发布的文档和相关图形中包含的信息的适用性、可靠性或准确性没有任何陈述或保证。 材料可能包括技术不准确或版式错误,随时可以不通知地进行修订。

在适用法律允许的最大范围内,MICROSOFT和/或其供应商声明并排除所有明示、默示或法定的声明、保证和条件,包括但不限于有关材料的产权、不侵权、满意的状态或质量、适销性以及针对特定用途的适合性。