使用SqliteDataReader
检索数据
SqliteDataReader
是用于从数据库检索数据的类。 它与SqliteCommand
类一起使用以执行 SQL SELECT
语句,然后访问返回的行。 它提供对查询结果的快速,仅转发和只读访问。 这是从表中检索数据的最有效方法。
我们不使用构造器,而是通过调用ExecuteReader()
method of theSqliteCommand
对象创建SqliteDataReader
的实例。 在使用SqlDataReader
时,关联的SqlConnection
为SqlDataReader
服务。 除了关闭SqlConnection
以外,无法对其进行其他操作。
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 辆汽车,并将它们打印到控制台。
using (SqliteDataReader rdr = cmd.ExecuteReader())
要创建SQLiteDataReader
对象,我们必须调用SqliteCommand
对象的ExecuteReader()
方法。
while (rdr.Read())
{
Console.WriteLine(rdr.GetInt32(0) + " "
+ rdr.GetString(1) + " " + rdr.GetInt32(2));
}
Read()
方法将数据读取器移至下一条记录。 如果有更多行,则返回true
;否则,返回false
。 否则为假。 我们可以使用数组索引符号来检索值,或者使用特定的方法来访问其本机数据类型中的列值。 后者效率更高。
$ mono retrieve.exe
1 Audi 52642
2 Mercedes 57127
3 Skoda 9000
4 Volvo 29000
5 Bentley 350000
Cars
表的前五行。
我们可以通过字段的列名来检索字段。
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 行。 这次我们使用列名来获取表字段。
while (rdr.Read())
{
Console.Write("{0} ", rdr["Id"]);
Console.Write("{0} ", rdr["Name"]);
Console.Write("{0} \n", rdr["Price"]);
}
数据库表字段由其列名引用。
多个语句
ADO.NET 规范允许在单个字符串中执行多个语句。 如有查询,SqliteDataReader
返回多个结果集。 它具有NextResult()
方法来浏览结果集。
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 字符串中有三个查询。 将有三个结果集。
string stm = "SELECT 25; SELECT 44; SELECT 33";
有三个SELECT
语句。 它们之间用分号分隔。 它们每个都将返回一个值。
do
{
rdr.Read();
Console.WriteLine("{0}", rdr.GetInt32(0));
} while (rdr.NextResult());
Read()
方法将SqliteDataReader
移至下一条记录。 GetInt32()
方法将值检索为 32 位带符号整数。 NextResult()
将数据读取器移至下一个结果。
$ dmcs multiple.cs -r:Mono.Data.Sqlite.dll
$ mono multiple.exe
25
44
33
运行示例。
我们已经完成了SqliteDataReader
的数据读取。