# 使用`SqliteDataReader`检索数据

> 原文： [http://zetcode.com/db/sqlitecsharp/read/](http://zetcode.com/db/sqlitecsharp/read/)

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

我们不使用构造函数，而是通过调用`ExecuteReader() `method of the` SqliteCommand` 对象创建`SqliteDataReader`的实例。 在使用`SqlDataReader`时，关联的`SqlConnection`为`SqlDataReader`服务。 除了关闭`SqlConnection`以外，无法对其进行其他操作。

```cs
using System;
using Mono.Data.Sqlite;

public class Example
{

    static void Main() 
    {
        string cs = "URI=file:test.db";

        using(SqliteConnection con = new SqliteConnection(cs))
        {
            con.Open();

            string stm = "SELECT * FROM Cars LIMIT 5";

            using (SqliteCommand cmd = new SqliteCommand(stm, con))
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read()) 
                    {
                        Console.WriteLine(rdr.GetInt32(0) + " " 
                            + rdr.GetString(1) + " " + rdr.GetInt32(2));
                    }         
                }
            }

            con.Close();   
         }
    }
}

```

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

```cs
using (SqliteDataReader rdr = cmd.ExecuteReader())

```

要创建`SQLiteDataReader`对象，我们必须调用`SqliteCommand`对象的`ExecuteReader()`方法。

```cs
while (rdr.Read()) 
{
    Console.WriteLine(rdr.GetInt32(0) + " " 
        + rdr.GetString(1) + " " + rdr.GetInt32(2));
}   

```

`Read()`方法将数据读取器移至下一条记录。 如果有更多行，则返回`true`；否则，返回`false`。 否则为假。 我们可以使用数组索引符号来检索值，或者使用特定的方法来访问其本机数据类型中的列值。 后者效率更高。

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

```

`Cars`表的前五行。

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

```cs
using System;
using Mono.Data.Sqlite;

public class Example
{

    static void Main() 
    {
        string cs = "URI=file:test.db";

        using(SqliteConnection con = new SqliteConnection(cs))
        {
            con.Open();

            string stm = "SELECT * FROM Cars LIMIT 5";

            using (SqliteCommand cmd = new SqliteCommand(stm, con))
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read()) 
                    {
                        Console.Write("{0} ", rdr["Id"]);
                        Console.Write("{0} ", rdr["Name"]);
                        Console.Write("{0} \n", rdr["Price"]);
                    }
                }         
            }

            con.Close();
        }
    }
}

```

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

```cs
while (rdr.Read()) 
{
    Console.Write("{0} ", rdr["Id"]);
    Console.Write("{0} ", rdr["Name"]);
    Console.Write("{0} \n", rdr["Price"]);
}

```

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

## 多个语句

ADO.NET 规范允许在单个字符串中执行多个语句。 如有查询，`SqliteDataReader`返回多个结果集。 它具有`NextResult()`方法来浏览结果集。

```cs
using System;
using Mono.Data.Sqlite;

public class Example
{

    static void Main() 
    {
        string cs = "Data Source=:memory:";

        using (SqliteConnection con = new SqliteConnection(cs))
        {
            con.Open();

            string stm = "SELECT 25; SELECT 44; SELECT 33";

            using (SqliteCommand cmd = new SqliteCommand(stm, con))
            {
                using (SqliteDataReader rdr = cmd.ExecuteReader())
                {
                    do
                    {
                        rdr.Read();
                        Console.WriteLine("{0}", rdr.GetInt32(0));

                    } while (rdr.NextResult());

                }                
            }

            con.Close();
        }
    }
}

```

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

```cs
string stm = "SELECT 25; SELECT 44; SELECT 33";

```

有三个`SELECT`语句。 它们之间用分号分隔。 它们每个都将返回一个值。

```cs
do
{
    rdr.Read();
    Console.WriteLine("{0}", rdr.GetInt32(0));

} while (rdr.NextResult());

```

`Read()`方法将`SqliteDataReader`移至下一条记录。 `GetInt32()`方法将值检索为 32 位带符号整数。 `NextResult()`将数据读取器移至下一个结果。

```cs
$ dmcs multiple.cs -r:Mono.Data.Sqlite.dll 
$ mono multiple.exe 
25
44
33

```

运行示例。

我们已经完成了`SqliteDataReader`的数据读取。