Vb.net 错误[07002][Microsoft][ODBC Microsoft Access驱动程序]参数太少。预期1
这让我发疯,我希望有人能帮助我。我正在使用Visual Studio Express 2012,并正在用VB制作一个Windows窗体应用程序,以访问MS access 2010数据库中的数据。这是使用ODBC Microsoft Access驱动程序完成的。我最初将所有SELECT、UPDATE和INSERT语句构建为字符串。我返回并将其更改为基于参数的命令,以处理特殊字符并消除数据库插入威胁。除一个查询外,所有查询都可以正常工作 下面是给我带来问题的代码:Vb.net 错误[07002][Microsoft][ODBC Microsoft Access驱动程序]参数太少。预期1,vb.net,odbc,ms-access-2010,Vb.net,Odbc,Ms Access 2010,这让我发疯,我希望有人能帮助我。我正在使用Visual Studio Express 2012,并正在用VB制作一个Windows窗体应用程序,以访问MS access 2010数据库中的数据。这是使用ODBC Microsoft Access驱动程序完成的。我最初将所有SELECT、UPDATE和INSERT语句构建为字符串。我返回并将其更改为基于参数的命令,以处理特殊字符并消除数据库插入威胁。除一个查询外,所有查询都可以正常工作 下面是给我带来问题的代码: Dim cmdSQLQuery A
Dim cmdSQLQuery As Odbc.OdbcCommand
cmdSQLQuery = SCCResources.dbConnSCCResources.CreateCommand
cmdSQLQuery.CommandText = "SELECT tblRepairRequests.ID as [Repair Request ID #], tblRepairRequests.RequestType as [Request Type], tblRepairRequests.PositionLocation as [Position #], tblRepairRequests.DateTimeSubmitted as [Date/Time Submitted], tblRepairRequests.DateTimeClosed as [Date/Time Closed], tblRepairRequests.Status, tblRepairRequests.SubmitterFirstName as [Submitter's First Name], tblRepairRequests.SubmitterLastName as [Submitter's Last Name], tblRepairRequests.SubmitterIDNumber as [Submitter's ID #], tblRepairRequests.SupervisorFirstName as [Supervisor First Name], tblRepairRequests.SupervisorLastName as [Supervisor Last Name], tblRepairRequests.SupervisorIDNumber as [Supervisor ID #], tblRepairRequests.ProblemDescription as [Problem Description], tblRepairRequests.DuplicateParent, tblRepairRequests.DuplicateChild, tblRepairRequests.Reopened FROM tblRepairRequests WHERE tblRepairRequests.ID = ?; "
cmdSQLQuery.Parameters.Clear()
cmdSQLQuery.Parameters.AddWithValue("ID", ID.Text)
cmdSQLQuery.CommandType = CommandType.Text
Dim daSearchResults As New System.Data.Odbc.OdbcDataAdapter(cmdSQLQuery)
Dim dsSearchResults As New System.Data.DataSet
Dim dvSearchResults As New System.Data.DataView
daSearchResults.Fill(dsSearchResults)
dvSearchResults = dsSearchResults.Tables(0).DefaultView
With dgvSearchResults
.DataSource = dvSearchResults
.Columns("Status").Visible = True
.Columns("DuplicateParent").Visible = False
.Columns("DuplicateChild").Visible = False
.Columns("Reopened").Visible = False
.Columns("Repair Request ID #").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Request Type").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Status").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Submitter's First Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Submitter's Last Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Submitter's ID #").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Date/Time Submitted").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Date/Time Submitted").DefaultCellStyle.Format = "MM/dd/yyyy HH:mm:ss"
.Columns("Supervisor First Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Supervisor Last Name").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Supervisor ID #").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Position #").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Problem Description").Width = 300
.Columns("Date/Time Closed").AutoSizeMode = DataGridViewAutoSizeColumnMode.AllCells
.Columns("Date/Time Closed").DefaultCellStyle.Format = "MM/dd/yyyy HH:mm:ss"
.ReadOnly = True
.Visible = True
End With
在DASAARCHRESULTS.FilldsSearchResults行中,我得到以下错误:错误[07002][Microsoft][ODBC Microsoft Access驱动程序]参数太少。预期1。
我知道命名参数不完全受支持,换句话说,可以按任何顺序添加。我使用它们是为了便于阅读,并且我以正确的顺序添加它们。我在命令上的手表显示了那里的参数。如果我使用以下字符串查询,它可以正常工作:
strSQLQuery = "SELECT DISTINCT tblRepairRequests.ID as [Repair Request ID #], tblRepairRequests.RequestType as [Request Type], tblRepairRequests.PositionLocation as [Position #], tblRepairRequests.DateTimeSubmitted as [Date/Time Submitted], tblRepairRequests.DateTimeClosed as [Date/Time Closed], tblRepairRequests.Status, tblRepairRequests.SubmitterFirstName as [Submitter's First Name], tblRepairRequests.SubmitterLastName as [Submitter's Last Name], tblRepairRequests.SubmitterIDNumber as [Submitter's ID #], tblRepairRequests.SupervisorFirstName as [Supervisor First Name], tblRepairRequests.SupervisorLastName as [Supervisor Last Name], tblRepairRequests.SupervisorIDNumber as [Supervisor ID #], tblRepairRequests.ProblemDescription as [Problem Description], tblRepairRequests.DuplicateParent, tblRepairRequests.DuplicateChild, tblRepairRequests.Reopened FROM tblRepairRequests WHERE tblRepairRequests.ID = 3;"
我不知道哪里出了问题,尤其是因为在同一数据库的同一程序中,类似的代码在另一个窗体上工作:
If SCCResources.CheckDBConnStateOpen(1) Then
Dim cmdSubmitRepairRequest As Odbc.OdbcCommand
cmdSubmitRepairRequest = SCCResources.dbConnSCCResources.CreateCommand
With cmdSubmitRepairRequest
.CommandText = "INSERT INTO tblRepairRequests([RequestType], [SubmitterFirstName], [SubmitterLastName], [SubmitterIDNumber], [DateTimeSubmitted], [SupervisorFirstName], [SupervisorLastName], [SupervisorIDNumber], [PositionLocation], [ProblemDescription], [Status], [DuplicateParent], [DuplicateChild], [Reopened]) VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"
.Parameters.Clear()
.Parameters.AddWithValue("RequestType", cbRequestType.SelectedValue)
.Parameters.AddWithValue("SubmitterFirstName", dtReportingUserList.Rows(cbPersonReporting.SelectedIndex).Item("FirstName"))
.Parameters.AddWithValue("SubmitterLastName", dtReportingUserList.Rows(cbPersonReporting.SelectedIndex).Item("LastName"))
.Parameters.AddWithValue("SubmitterIDNumber", dtReportingUserList.Rows(cbPersonReporting.SelectedIndex).Item("SheriffID"))
.Parameters.AddWithValue("DateTimeSubmitted", Today.ToString("MM/dd/yyyy") & " " & TimeOfDay.ToString("HH:mm:ss"))
.Parameters.AddWithValue("SupervisorFirstName", dtSupervisorContactedList.Rows(cbSupervisorContacted.SelectedIndex).Item("FirstName"))
.Parameters.AddWithValue("SupervisorLastName", dtSupervisorContactedList.Rows(cbSupervisorContacted.SelectedIndex).Item("LastName"))
.Parameters.AddWithValue("SupervisorIDNumber", dtSupervisorContactedList.Rows(cbSupervisorContacted.SelectedIndex).Item("SheriffID"))
If cbPositionLocation.SelectedValue = "" Then
.Parameters.AddWithValue("PositionLocation", "")
Else
.Parameters.AddWithValue("PositionLocation", cbPositionLocation.SelectedValue)
End If
.Parameters.AddWithValue("ProblemDescription", tbProblemDescription.Text)
.Parameters.AddWithValue("Status", "Open")
.Parameters.AddWithValue("DuplicateParent", False)
.Parameters.AddWithValue("DuplicateChild", False)
.Parameters.AddWithValue("Reopened", False)
.CommandType = CommandType.Text
.ExecuteNonQuery()
.CommandText = "SELECT @@Identity"
MessageBox.Show("The repair request has been submitted. The request number is: " & cmdSubmitRepairRequest.ExecuteScalar(), "Repair Request Submitted", MessageBoxButtons.OK, MessageBoxIcon.Information)
End With
End If
我已尝试为参数使用不同的名称,但没有更改。除了使用基于字符串的查询,我似乎什么都做不了。非常令人沮丧,尤其是因为类似的代码在我的程序中工作。感谢您的帮助。谢谢。用3替换ID.Text时会发生什么情况?我已经尝试过了,同样的情况也会发生。我尝试将3同时作为字符串和整数…相同的错误。因此,有效和无效的唯一区别是将ID.Text的值添加为参数与将3添加为参数值?不。它根本不作为参数。使用ID.Text作为参数值或硬编码参数值没有区别。我能让它工作的唯一方法是将查询构建为字符串,而不是使用参数,并且可以使用ID.Text或硬编码值。为了排除故障,您可以尝试像这样添加参数,假设它是整数:cmdSQLQuery.parameters.AddID,OdbcType.Int.value=integer.ParseID.Text