ZetCode

使用 SqliteDataReader 检索数据

最后修改于 2020 年 7 月 6 日

SqliteDataReader 类用于从数据库中检索数据。 它与 SqliteCommand 类一起使用,用于执行 SQL SELECT 语句,然后访问返回的行。 它提供对查询结果的快速、只进、只读访问。 它是从表中检索数据的最有效方法。

我们不是使用构造函数,而是通过调用 SqliteCommand 对象的 ExecuteReader 方法来创建 SqliteDataReader 的实例。 在使用 SqlDataReader 期间,相关的 SqlConnectionSqlDataReader 提供服务。 除了关闭 SqlConnection 之外,不能对其执行任何其他操作。

Option Strict On

Imports Mono.Data.Sqlite

Module Example

    Sub Main()

        Dim cs As String = "URI=file:test.db"

        Using con As New SqliteConnection(cs)        
            con.Open()
        
            Using cmd As New SqliteCommand(con)

                cmd.CommandText = "SELECT * FROM Cars LIMIT 5"
                
                Dim rdr As SqliteDataReader = cmd.ExecuteReader()

                Using rdr                
                    While (rdr.Read())
                        Console.WriteLine(rdr.GetInt32(0) & " " _ 
                            & rdr.GetString(1) & " " & rdr.GetInt32(2))
                    End While         
                End Using        
            End Using

            con.Close()
        End Using
        
    End Sub

End Module

我们从 Cars 表中获取 5 辆汽车,并将它们打印到控制台。

Dim rdr As SqliteDataReader = cmd.ExecuteReader()

要创建 SQLiteDataReader 对象,我们必须调用 SqliteCommand 对象的 ExecuteReader 方法。

While (rdr.Read())
    Console.WriteLine(rdr.GetInt32(0) & " " _ 
        & rdr.GetString(1) & " " & rdr.GetInt32(2))
End While

Read 方法将数据读取器推进到下一条记录。 如果有更多行,则返回 true;否则返回 false。 我们可以使用数组索引表示法检索值,或者使用特定方法以其原生数据类型访问列值。 后者更有效。

$ mono retrieve.exe 
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000

Cars 表的前五行。

我们可以通过列名检索字段。

Option Strict On

Imports Mono.Data.Sqlite

Module Example

    Sub Main()

        Dim cs As String = "URI=file:test.db"

        Using con As New SqliteConnection(cs)        
            con.Open()
        
            Using cmd As New SqliteCommand(con)
                cmd.CommandText = "SELECT * FROM Cars LIMIT 5"
                
                Dim rdr As SqliteDataReader = cmd.ExecuteReader()

                Using rdr
                    While (rdr.Read())
                        Console.Write("{0} ", rdr("Id"))
                        Console.Write("{0} ", rdr("Name"))
                        Console.WriteLine("{0} ", rdr("Price"))
                    End While         
                End Using

            End Using
            con.Close()
        End Using
        
    End Sub

End Module

该示例从 Cars 表中打印 5 行。 这次我们使用列名来获取表字段。

While (rdr.Read())
    Console.Write("{0} ", rdr("Id"))
    Console.Write("{0} ", rdr("Name"))
    Console.WriteLine("{0} ", rdr("Price"))
End While

数据库表字段通过其列名引用。

多个语句

ADO.NET 规范允许在单个字符串中执行多个语句。 在查询的情况下,SqliteDataReader 返回多个结果集。 它具有 NextResult 方法来浏览结果集。

Option Strict On

Imports Mono.Data.Sqlite

Module Example

    Sub Main()

        Dim cs As String = "URI=file:test.db"

        Using con As New SqliteConnection(cs)       
            con.Open()
        
            Using cmd As New SqliteCommand(con)
                cmd.CommandText = "SELECT 25; SELECT 44; SELECT 33"
                
                Dim rdr As SqliteDataReader = cmd.ExecuteReader()

                Using rdr                
                    Do                    
                        rdr.Read()
                        Console.WriteLine("{0}", rdr.GetInt32(0))
                    Loop While rdr.NextResult()         
                End Using      
            End Using

            con.Close()
        End Using
        
    End Sub

End Module

我们在一个 SQL 字符串中有三个查询。 将有三个结果集。

cmd.CommandText = "SELECT 25; SELECT 44; SELECT 33"

有三个 SELECT 语句。 它们由分号分隔。 它们中的每一个都将返回一个值。

Do                    
    rdr.Read()
    Console.WriteLine("{0}", rdr.GetInt32(0))

Loop While rdr.NextResult()

Read 方法将 SqliteDataReader 推进到下一条记录。 GetInt32 方法将该值作为 32 位有符号整数检索。 NextResult 将数据读取器推进到下一个结果。

$ mono multiple.exe 
25
44
33

运行示例。

我们已经完成了使用 SqliteDataReader 读取数据。