Как сделать соединение базы данных VFP с VB.NET - PullRequest
2 голосов
/ 08 июля 2019

Я создаю систему, которая использует foxpro в качестве базы данных.Я продолжаю получать эту ошибку error [42S02][microsoft][ODBC visual foxpro driver] not a table, когда я хочу соединить базу данных VFP с Visual Studio.Когда я добавляю соединение для передачи данных в Visual Studio, оно показывает успешное соединение, но когда я пытаюсь открыть таблицу, оно показывает ошибку.

Это система VB.Net, которая использует базу данных foxpro 9. У меня естьиспользуйте 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 голосов
/ 09 июля 2019

Версии базы данных VFP более поздние, чем 6.x, не имеют официального драйвера ODBC от Microsoft.Если вы ДОЛЖНЫ использовать ODBC, вы можете найти альтернативные драйверы из таких источников, как Sybase ADS.Вместо этого я успешно использую OLEDB.

Хотя ваш код может работать с MySQL, вы не должны писать его.Кроме того, это специфично для MySQL, оно не будет работать, скажем, в MS SQL Server или postgreSQL.Вы должны прочитать документацию на используемый вами бэкэнд.В VFP (или MS SQL Server, postgreSQL ...) вы не используете обратные тики в качестве идентификаторов имен таблиц и полей.В VFP, если необходимо, чтобы использовать идентификаторы имен, вы можете использовать одинарные, двойные кавычки или квадратные скобки, но вам нужно будет заключать в скобки (и использовать только для имени таблицы в запросе SQL).В любом случае, простой способ - просто вообще не использовать идентификаторы.

Кроме того, вам нужно использовать запрос ODBC или OLEDB?в качестве параметра-заполнителя.Использование @staffID обычно не работает в MySQL ... тоже, но производители драйверов решили поддержать их для этих бэкэндов.

Судя по сообщениям MessageBox, вы ожидаете получить одну строку для этого запроса (я не знаю, почему вы используете и staffId, и staffName, если staffId является первичным ключом).В любом случае вот ваш запрос в 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
...