我正在尝试做一个小程序,使用Genie编程语言搜索SQLite数据库中的特定条目。然而,我陷入了一个困境,即准备好的陈述没有选择正确的条目。我想这句话的语法有问题。
首先,这里是搜索功能:
def SearchForRecipe (db:Database)
print "-------------------------------"
print " Search in"
print "-------------------------------"
print " 1 - Recipe Name"
print " 2 - Recipe Source"
print " 3 - Ingredients"
print " 4 - Exit"
searchin:string = UserInterface.raw_input("Enter Search Type -> ")
search:string = " "
sql:string = " "
response:string=" "
if searchin != "4"
if searchin == "1"
search = "Recipe Name"
else if searchin is "2"
search = "Recipe Source"
else if searchin is "3"
search = "Ingredients"
else
print "An Error Occured"
print "--------------------------------------------------------------------------------------"
Process.exit (-1)
parm:string = searchin
response = UserInterface.raw_input ("Search for what in "+ search +" (blank to exit) -> ")
if parm == "1" // Recipe Name
stmt:Statement = PreparedStatements.select_recipe(db, response)
var row = new dict of string, string
cols:int = stmt.column_count ()
print cols.to_string()
for i:int = 0 to (cols - 1)
row[ stmt.column_name( i ) ] = stmt.column_text( i )
stdout.printf( "%-30s", row[ "name" ])
stdout.printf( "%-20s", row[ "servings" ])
stdout.printf( "%-30sn", row[ "source" ])
问题发生在if循环中:if parm == "1" // Recipe Name
,在下面的行中,当我要求打印所选条目的列数时,它会返回零。我添加这一行是为了尝试解决正在发生的问题,但这可能不是最好的方法
准备好的语句在一个名称空间内,如下所示:
namespace PreparedStatements
def select_recipe (db:Database, res:string) : Statement
statement:Statement
db.prepare_v2( "SELECT pkid,name,source,servings FROM Recipes WHERE name like" + res, -1, out statement)
return statement
我认为SELECT_recipe函数中的SELECT语句有问题,因为它没有在数据库中选择正确的条目。
问题:如何正确选择条目?我应该使用另一种方法,还是一份事先准备好的声明才是正确的方法?
如果使用LIKE
,则需要用双引号分隔文本,如果文本可以是子字符串,则还需要在%
符号之间分隔文本:
db.prepare_v2( "SELECT pkid,name,source,servings FROM Recipes WHERE name like "%" + res + "%"", -1, out statement)
反斜杠"转义"双引号,因此不会将其读作文本的末尾。尝试以下两者之间的区别:
print "my "test""
和
print "my "test""
如果需要转义百分比符号,请使用两个百分比符号。例如比较:
print "A big %age"
带有
print "A big %%age"
请记住,百分比符号用于printf
样式的变量格式。
否则,您可以在SQL:中逐字记录字符串
db.prepare_v2( """SELECT pkid,name,source,servings FROM Recipes WHERE name like "%""" + res + """%"""", -1, out statement)
下一阶段是阅读你的结果。您的代码似乎已接近目标,但缺少stmt.step()
,并且处理该调用的返回值为ROW
或DONE
。如果您没有使用Sqlite
名称空间,那么它将是Sqlite.ROW
和Sqlite.DONE
。有关将SQLite C API用于SELECT语句的几个示例,请参阅Vala SQLite示例和SQLite C接口获得单值结果。