2015-12-18 3 views
0

Я пытаюсь выполнить небольшую программу, которая ищет определенную запись в базе данных SQLite с использованием языка программирования Genie. Однако я застрял в точке, где подготовленный оператор не выбирает правильную запись. Я полагаю, что в синтаксисе утверждения есть что-то не так.Создание функции, которая ищет базу данных SQLite с использованием языка программирования genie

Во-первых, здесь есть функция поиска:

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("%-30s\n", row[ "source" ]) 

Проблема происходит в, если петля: 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, потому что она не выбирает правильную запись в базы данных.

Вопрос: Как правильно выбрать запись? Должен ли я использовать другой подход, или подготовленное заявление - правильный способ сделать это?

ответ

1

Если вы используете 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 Sample и Sqlite C interface get single value result.