如何使用cmd显示列中的所有元素.从Visual Basic中的mdf数据文件执行读卡器



这是我的.mdf数据库文件,它有5列

我想将Id列中的每个值添加到列表中

Private Sub Read_Click(sender As Object, e As EventArgs) Handles Read.Click
Try
If con.State = ConnectionState.Open Then
con.Close()
End If
con.Open()
cmd = con.CreateCommand()
cmd.CommandType = CommandType.Text
cmd.CommandText = "SELECT Id FROM tablekongbago"
cmd.ExecuteNonQuery()
Dim dr As SqlClient.SqlDataReader
dr = cmd.ExecuteReader(CommandBehavior.CloseConnection)
While dr.Read
element = dr.GetInt32(0).ToString()
End While
Catch ex As Exception
End Try
MessageBox.Show(element)
End Sub

问题是,我只能使用检索Id列的最后一行,而不能检索Id列中的所有值

element = dr.GetInt32(0).ToString()

如果我尝试迭代并将其转换为

dr.GetInt32(1).ToString()

它什么也不显示。

我想创建一个List(of Integer(的Id集合。我知道如何创建列表和for循环,但我不知道如何从我的Id列中检索所有Id,如果";dr.GetInt32(0(";仅用于Id列的最后一行?,有没有一种方法可以让我从Id列的第一行开始循环到最后一行?我想要像";list[0]-引用第一行,list[2]-引用最后一行,这样我就可以将其添加到我的list(Of Integer(中。

每当我看到If con.State = ConnectionState.Open Then时,我都会退缩。连接应该在使用它们的方法中声明。你永远不应该质疑ConnectionState

你已经执行了两次命令。在非查询中选择。NoQuery是Insert、Update和Delete。

您的While循环在每次迭代中都会覆盖element变量,因此您只能获得最后一条记录中的值。

切勿写入空的Catch块。它只会吞下错误,你可能会得到意想不到的结果,而不知道为什么。

将数据库代码与用户界面代码分离是个好主意。

使用Using...End Using块创建连接和命令,这样您就知道它们已被正确处理。读者也是如此。我喜欢尽可能少地与读者打交道,因为这需要开放的连接,而且连接应该在尽可能短的时间内开放。

Private ConStr As String = "Your connection string"
Private Sub Read_Click(sender As Object, e As EventArgs) Handles Read.Click
Dim dt As DataTable
Try
dt = GetIds()
Catch ex As Exception
MessageBox.Show(ex.Message)
Return
End Try
Dim ListOfIDs = (From row As DataRow In dt.AsEnumerable
Select CInt(row(0))).ToList
ListBox1.DataSource = ListOfIDs
End Sub
Private Function GetIds() As DataTable
Dim dt As New DataTable
Using con As New SqlConnection(ConStr),
cmd As New SqlCommand("SELECT Id FROM tablekongbago;", con)
con.Open()
Using reader = cmd.ExecuteReader
dt.Load(reader)
End Using
End Using
Return dt
End Function

您只需创建一个Integer列表,并在每次调用dr.Read()时将ID添加到集合中

Dim ids = New List(Of Integer)()
While dr.Read()
ids.Add(dr.GetInt32(0))
End While

您的代码看起来有点混乱。这应该有效:

请注意,sql命令对象非常好。

It has a reader built in - you don't need to define one
It has the command text  - you don't need to define one
it has a connection object - again no need to create one (but you look to have one)

使用dataTable是很好的,因为您可以使用for/each,或者使用MyTable.Rows(rownum(来获取一行。

数据表很好,因为您不需要循环来读取数据——使用sqlcommand对象中的内置数据读取器。

Using cmdSQL As New SqlCommand("Select Id FROM tblekingbago", con)
cmdSQL.Connection.Open()
Dim MyTable As New DataTable
MyTable.Load(cmdSQL.ExecuteReader)
' table is now loaded with all "ID"
' you can see/use/display/play/have fun with ID like this:
For Each OneRow As DataRow In MyTable.Rows
Debug.Print(OneRow("Id"))
Next
' display the 5th row (it is zero based)
Debug.Print(MyTable.Rows(4).Item("Id"))
End Using

最新更新