func getUserByEmpNum(_ id: Int) -> String {
let nameQuery: String = "SELECT fld_str_firstname, fld_str_lastName FROM userView WHERE fld_int_id = \(id);"
var returnStr = ""
do {
let dbQueue = try DatabaseQueue(path: MYCDatabase.pathToDatabase)
try dbQueue.inTransaction(.none) { (db) -> Database.TransactionCompletion in
let returnStrs = try String.fetchAll(db, sql: nameQuery)
// Placing a breakpoint here, returnStrs only has one element?
return .commit
}
} catch {
print (error)
}
return returnStr
}
在此代码中,如果我执行类似select fld_str_firstname from myOwnUserView where fld_int_id = 2;
的查询,则可以在returnStrs数组中得到一个元素,这与预期的一样。然后选择两个字段,就像在nameQuery中一样,我仍然只在returnStrs数组中得到一个字符串。
这是为什么,如何使它适合以获取响应中所有选定的列?
答案 0 :(得分:2)
String.fetchAll
返回从最左边的选定列中提取的字符串数组,形式为documented。每获取的行一个字符串。每个选定的列都没有一个字符串。
如果要从几列中获取字符串,请使用Row.fetchAll
,它返回数据库行的数组。从这些行中,您可以提取感兴趣的每一列:
let rows = try Row.fetchAll(db, sql: "SELECT fld_str_firstname, fld_str_lastName FROM ...")
for row in rows {
let firstName: String = row["fld_str_firstname"]
let lastName: String = row["fld_str_lastName"]
}
有关从数据库行中提取值的更多信息,请参见文档的this chapter。
由于您正在从标识其ID的单行中读取名称,因此您可能更喜欢使用fetchOne
方法,该方法消耗单个数据库行(请参见Fetching Methods):
if let row = try Row.fetchOne(db, sql: "SELECT ... WHERE fld_int_id = ?", arguments: [id]) {
let firstName: String = row["fld_str_firstname"]
let lastName: String = row["fld_str_lastName"]
// Use first and last name
} else {
// ID does not exist in the database: do what is appropriate.
}