Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/vb.net/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用VB.NET连接VFP数据库_Vb.net_Visual Foxpro - Fatal编程技术网

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

如何用VB.NET连接VFP数据库,vb.net,visual-foxpro,Vb.net,Visual Foxpro,我正在创建一个使用foxpro作为数据库的系统。当我想将VFP数据库与visualstudio连接时,我不断收到此错误错误[42S02][microsoft][ODBC visualfoxpro driver]不是表。当我在VisualStudio中添加数据连接时,它显示连接成功,但当我尝试打开表时,它显示错误 这是一个使用数据库foxpro9的VB.Net系统。我已经使用mysql作为数据库,它可以工作,但是当我尝试使用foxpro数据库时,我得到了一个错误 Imports System.Da

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

这是一个使用数据库foxpro9的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

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

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

虽然您的代码可以使用MySQL,但这不是您应该使用的编写方式。而且,它是特定于MySQL的,在MS SQL Server或postgreSQL中也不起作用。您应该阅读正在使用的后端上的文档。在VFP(或MS SQL Server、postgreSQL…)中,不使用back tics作为表和字段名标识符。在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
导入System.Data.OleDb
公共类登录
Private Sub BTENTER_Click(发送者作为对象,e作为事件参数)处理BTENTER。单击
Dim strConn As String=“Provider=VFPOLEDB;数据源=c:\MyDataFolder\”
Dim strQuery As String=选择*
从登录
其中staffID=?员工姓名=?
将cn用作新的OLEDB连接(strConn)
使用cmd作为新的OleDbCommand(strQuery,cn)
cmd.Parameters.Add(“@staffid”,OleDbType.VarChar).Value=txtStaffID.Text;
cmd.Parameters.Add(“@staffname”,OleDbType.VarChar).Value=txtStaffName.Text;
cn.Open()
作为OleDbDataReader=cmd.ExecuteReader()的Dim rdr
如果rdr.Read()
MessageBox.Show(“欢迎”&txtStaffName.Text)
变暗的窗体作为新窗体离开
form.PassStaffid=txtStaffID.Text
form.PassStaffName=txtStaffName.Text
表格.Show()
我躲起来
其他的
MessageBox.Show(“员工ID或员工姓名不可用”)
如果结束
cn.Close()
终端使用
终端使用
端接头
末级

为什么要使用
CreateObject
然后创建一个不使用的
OleDbConnection
?摆脱
oConn
并使用您创建的
OleDbConnection
。为什么要在
选择Count(*)时关闭整个记录…其中…
使用
,ExecuteCalar
就是您所需要的?您正在打开表单并显示一个连接打开的消息框。@Mary,您所说的是对的。我在解释中记下了这一点,但仍然将查询作为原始查询编写。如果从逻辑角度看,staffId应该是主键,staffName应该根本不需要作为参数。