文档首页
X DevAPI 用户指南
下载本手册
PDF (US Ltr) - 1.4Mb
PDF (A4) - 1.4Mb


X DevAPI 用户指南  /  使用结果集  /  一次性获取所有数据项

9.4 一次性获取所有数据项

除了使用 fetchOne() 的模式(在 第 9.3 节 “使用数据集” 中解释)之外,X DevAPI 还提供了一种使用 fetchAll() 的模式,它将数据集的所有数据项作为列表传递给应用程序。不同的 X DevAPI 实现使用其编程语言的适当数据类型来表示列表。由于使用了不同的数据类型,因此支持使用语言的原生构造来访问列表元素。以下示例假设 test 模式存在并且 employee 表存在于 myTable 中。

MySQL Shell JavaScript 代码

var myResult = myTable.select(['name', 'age']).
  where('name like :name').bind('name','L%').
  execute();

var myRows = myResult.fetchAll();

for (index in myRows){
  print (myRows[index].name + " is " + myRows[index].age + " years old.");
}

MySQL Shell Python 代码

myResult = myTable.select(['name', 'age']) \
  .where('name like :name').bind('name','L%') \
  .execute()

myRows = myResult.fetch_all()

for row in myRows:
  print("%s is %s years old." % (row.name, row.age))

Node.js JavaScript 代码

myTable.select(['name', 'age'])
  .where('name like :name')
  .bind('name', 'L%')
  .execute()
  .then(myResult => {
    var myRows = myResult.fetchAll();

    myRows.forEach(row => {
      console.log(`${row[0]} is ${row[1]} years old.`);
    });
  });

C# 代码

var myRows = myTable.Select("name", "age")
  .Where("name like :name").Bind("name", "L%")
  .Execute();
var rows = myRows.FetchAll();

Python 代码

result = myTable.select(['name', 'age']) \
    .where('name like :name').bind('name', 'L%') \
    .execute()

rows = result.fetch_all()

for row in rows:
    print("{0} is {1} years old.".format(row["name"], row["age"]))

Java 代码

RowResult myRows = myTable.select("name, age")
  .where("name like :name").bind("name", "L%")
  .execute();

List<Row> rows = myRows.fetchAll();
for (Row row : rows) {
  // Accessing the fields
  System.out.println(" Age: " + row.getInt("age") + "\n");
}

C++ 代码

RowResult myRows = myTable.select("name, age")
                          .where("name like :name")
                          .bind("name", "L%")
                          .execute();

std::list<Row> rows = myRows.fetchAll();
for (Row row : rows)
{
  cout << row[1] << endl;
}

// Directly iterate over rows, without storing them in a container

for (Row row : myRows.fetchAll())
{
  cout << row[1] << endl;
}

当混合使用 fetchOne()fetchAll() 从一个数据集中读取数据时,请记住,每次调用 fetchOne()fetchAll() 都会消耗返回的数据项。已消耗的项无法再次请求。例如,如果应用程序调用 fetchOne() 获取数据集的第一个数据项,则随后调用 fetchAll() 将返回第二个到最后一个数据项。第一个项目不是 fetchAll() 返回的数据项列表的一部分。类似地,在先前调用 fetchAll() 之后再次为数据集调用它时,第二次调用将返回一个空集合。

使用 fetchAll() 会强制连接器在内存中构建所有项目的列表,然后才能将整个列表传递给应用程序。列表的生命周期独立于生成它的数据集的生命周期。