如何使用VB.NET建立VFP数据库连接

时间:2019-07-08 06:41:39

标签: vb.net visual-foxpro

我正在创建一个使用foxpro作为数据库的系统。当我想将VFP数据库与Visual Studio连接时,我不断收到此错误error [42S02][microsoft][ODBC visual foxpro driver] not a table。当我在Visual Studio中添加数据连接时,它显示连接成功,但是当我尝试打开表时,它显示错误。

这是一个使用数据库foxpro 9的VB.Net系统。我已经使用mysql作为数据库并且可以正常工作,但是当我尝试使用foxpro数据库时,我得到了一个错误。

Imports System.Data.Odbc
Imports System.Data.OleDb

Public Class login

    Private Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click
        Dim oConn = CreateObject("adodb.connection")
        oConn.ConnectionString = "Provider=vfpoledb;DSN=visual_foxpro"
        oConn.Open()
        Dim conn = New OleDbConnection()

        Dim cmdString As String = "SELECT * FROM `login` WHERE `staffID`= @staffid AND `staffName`= @staffname"
        Dim cmd As New OleDbCommand(cmdString, oConn)
        cmd.Parameters.Add(New OleDbParameter("staffID", CType(txtStaffID.Text, String)))
        cmd.Parameters.Add(New OleDbParameter("staffName", CType(txtStaffID.Text, String)))

        Dim adapter As New OleDbDataAdapter(cmd)
        Dim table As New DataTable()

        adapter.Fill(table)

        If table.Rows.Count = 0 Then
            MessageBox.Show("Staff ID or Staff Name not available")

        Else
            MessageBox.Show("Welcome " & txtStaffName.Text)

            Dim form As New formLeave

            form.PassStaffid = txtStaffID.Text
            form.PassStaffName = txtStaffName.Text
            form.Show()
            Me.Hide()

        End If

    End Sub

End Class

我希望系统可以使用数据库登录。

1 个答案:

答案 0 :(得分:0)

6.x以后的VFP数据库版本没有Microsoft的官方ODBC驱动程序。如果必须使用ODBC,则可以从Sybase ADS等源中找到替代驱动程序。我成功地使用了OLEDB。

虽然您的代码可能适用于MySQL,但这不是您应该编写的方式。另外,它是MySQL特有的,它在MS SQL Server或postgreSQL中也不起作用。您应该阅读所用后端上的文档。在VFP(或MS SQL Server,postgreSQL ...)中,您不使用back tic作为表和字段名称标识符。在VFP中,如果需要的话,要使用名称标识符,可以使用单引号,双引号或方括号,但是需要用括号括起来(并且仅用于SQL查询中的表名)。无论如何,最简单的方法就是根本不使用标识符。

此外,对于ODBC或OLEDB查询,您需要使用?作为参数占位符。在MySQL中,通常也无法使用@staffID,但是驱动程序制造商决定为这些后端提供支持。

从您的messageBox消息中,看起来您希望为该查询获得一行(我不知道为什么如果staffId是主键,为什么同时使用staffId和staffName)。无论如何,这是您在VB.Net中的查询:

Imports System.Data.OleDb

Public Class login

    Private Sub btnEnter_Click(sender As Object, e As EventArgs) Handles btnEnter.Click
        Dim strConn As String = "Provider=VFPOLEDB;Data source=c:\MyDataFolder\"
        Dim strQuery As String = <sql>SELECT * 
                                      FROM login 
                                      WHERE staffID=? AND staffName=?
                                 </sql>

        Using cn As New OleDbConnection(strConn)
            Using cmd As New OleDbCommand(strQuery, cn)
                cmd.Parameters.Add("@staffid", OleDbType.VarChar).Value = txtStaffID.Text;
            cmd.Parameters.Add("@staffname", OleDbType.VarChar).Value = txtStaffName.Text;
            cn.Open()
                Dim rdr As OleDbDataReader = cmd.ExecuteReader()
                If rdr.Read()
                    MessageBox.Show("Welcome " & txtStaffName.Text)

                    Dim form As New formLeave

                    form.PassStaffid = txtStaffID.Text
                    form.PassStaffName = txtStaffName.Text
                    form.Show()
                    Me.Hide()
                Else
                    MessageBox.Show("Staff ID or Staff Name not available")
                End If
                cn.Close()
            End Using
        End Using
    End Sub

End Class