我正在制作一个使用sql服务器数据库的vb .net winform项目。用户在文本框中输入访问工厂的人员的详细信息(名字,姓氏,公司,联系电话等),单击“保存详细信息”按钮,这会将数据保存在数据表中。效果很好,问题出在下一部分。然后,将用户重定向到另一种表单,从数据库显示输入详细信息。这适用于第一个记录,但不适用于此后的任何记录输入,我收到一条错误消息,指出“在位置'n'处没有行”,并且以下代码行在form_Load中突出显示:
txtFirstName.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(1))
它告诉我,第0行之后没有任何行,但是我知道它们是因为我已经输入了它们,并且它们显示在sql server数据库管理器的数据表中。我无法解决此问题,对此将提供任何帮助。我将附加解决此问题的其余代码。先谢谢了。
Private Sub previousVisitor_Load(sender As Object, e As EventArgs) Handles MyBase.Load
connectionString = "Data Source=.\SQLExpress;InitialCatalog=Visitors;" & _
"IntegratedSecurity=True;MultipleActiveResultSets=True"
sqlVisitorDetails = "SELECT * FROM visitorDetails WHERE idNumber=@idNumber"
sqlCon.Open()
sqlCmd = New SqlCommand(sqlVisitorDetails, sqlCon)
sqlCmd.Parameters.AddWithValue("@idNumber", txtIdNumber.Text)
dtVisitorDetails = loadDtVisitorDetails()
txtFirstName.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(1))
txtLastName.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(2))
txtCompany.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(3))
txtContactNumber.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(4))
txtCountryCode.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(5))
txtEmail.Text = CStr(dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)).Item(7))
sqlCmd.Dispose()
sqlCon.Close()
End Sub
Private Function loadDtVisitorDetails() As DataTable
Dim dtVisitorDetails As DataTable = Nothing
sqlVisitorDetails = "SELECT * FROM visitorDetails WHERE idNumber=" & txtIdNumber.Text
dtVisitorDetails = fillDtVisitorDetails(sqlVisitorDetails)
Return dtVisitorDetails
End Function
Public Function fillDtVisitorDetails(ByVal sqlVisitorDetails As String) As DataTable
Dim dtVisitorDetails As New DataTable
Dim da As New SqlDataAdapter
Dim conCmd As New SqlCommand
conCmd.CommandText = sqlVisitorDetails
da.SelectCommand = conCmd
da.SelectCommand.Connection = sqlCon
dtVisitorDetails.Columns.GetEnumerator()
da.Fill(dtVisitorDetails)
Return dtVisitorDetails
End Function
由于每个唯一ID号只能有1行,因此当您搜索和过滤WHERE idNumber = ID Number in form
为时,最多应获得1条记录。这意味着DataTable
罐子最多只能有1行。
当你访问Rows
一个的DataTable
一样dt.Rows(ID)
,你想在位置号码访问该行ID
的行的收藏。因此,当您dtVisitorDetails.Rows(CInt(CDbl(txtIdNumber.Text) - 1)
对ID号大于1的任何值进行操作时,它将失败,因为该索引在表中根本不存在。
相反,您应该直接使用dtVisitorDetails.Rows(0)
来访问该行。由于您已按ID Numberm进行了过滤,因此您只会获得该人的详细信息。最后,请记住为表中的行数添加检查,这样,如果您搜索没有记录的ID,尝试从表中检索就不会出错。
伪代码:
If dtVisitorDetails.Rows.Count > 0
txtFirstName.Text = CStr(dtVisitorDetails.Rows(0).Item(1))
...
End If
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句