企业🤖AI Agent构建引擎,智能编排和调试,一键部署,支持私有化部署方案 广告
# 使用`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`的数据读取。