如何用VB.NET连接VFP数据库
我正在创建一个使用foxpro作为数据库的系统。当我想将VFP数据库与visualstudio连接时,我不断收到此错误如何用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
错误[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应该根本不需要作为参数。