Как использовать переменную в запросе SQLite? - PullRequest
0 голосов
/ 19 февраля 2019

Я начал дурачиться с SQLite и Dapper в проекте Unity и довольно быстро наткнулся на мою первую проблему.Я хочу иметь возможность заменить определенное выражение в запросе переменными (как в условии WHERE), например, чтобы отфильтровать список строк с записями, содержащими определенную строку в определенном столбце.

В моем примеребаза данных содержит имя и фамилию, а также несколько других значений.Теперь я хочу прочитать все строки с именем «Ли».Это прекрасно работает, если я просто ввожу это вручную в запросе или если я использую параметр и устанавливаю значение параметра в Lee.Но если я попытаюсь установить значение параметра для определенной строковой переменной (например, из поля ввода текста), оно не будет работать.

public void Read(string searchTerm)
{
    Debug.Log("Started searching for: " + searchTerm);
    SqliteConnection dbcon = new SqliteConnection(connection);
    dbcon.Open();

    var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable WHERE first_name LIKE :a", new {a = searchTerm});

    foreach (TestSubject d in results)
    {
        Debug.Log("First Name: " + d.first_name.ToString());
        Debug.Log("Last Name: " + d.last_name.ToString());
        Debug.Log("Age: " + d.age.ToString());
    }

    dbcon.Close();
}

Как упоминалось ранее, если я использую {a = "Lee "}, я получаю результаты, но если я использую приведенный выше код, где searchTerm =" Lee ", я не получаю никаких результатов.

Я попробовал другой синтаксис, даже посмотрел в dapper (что не помогло с моей проблемой, но облегчило обработку результатов).Я делаю что-то не так или это просто невозможно с SQLite?

РЕДАКТИРОВАТЬ: вероятно, я должен упомянуть, что строка searchTerm происходит из поля ввода текста, и функция Read (...) срабатывает при нажатиикнопка «поиск».Смутно помню, что раньше у меня были проблемы с сгенерированными пользователем строками, которые были реализованы в коде, но это должно отличаться, поскольку оно выполняется только после того, как строка уже установлена, верно?

EDIT2: я попробовал что-то другое сейчас.Я получил всю таблицу из запроса и попытался отфильтровать результаты с помощью условного выражения foreach.К сожалению, это ведет себя так же, как и раньше - если я использую «Lee» вместо searchTerm, это работает, если я использую searchTerm, это не так.Однако это показывает, что проблема, скорее всего, связана не с SQLite, а с чем-то другим.

var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable");

foreach (TestSubject d in results)
{
    if (d.first_name.Contains(searchTerm))
    {
        Debug.Log("First Name: " + d.first_name.ToString());
        Debug.Log("Last Name: " + d.last_name.ToString());
        Debug.Log("Age: " + d.age.ToString());
    }
} 

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Проблема, по-видимому, заключалась в том, что я использовал поле TextMeshPro-Input (вместо общего поля из Unity) для строки searchText.Так что, несмотря на то, что при печати все выглядело одинаково, на самом деле это не так.Может быть, он использует другую кодировку или другие культурные настройки?В любом случае, использование «нормального» поля ввода работает.Спасибо за помощь и ценные предложения!

РЕДАКТИРОВАТЬ: Эту ошибку также можно избежать, если фактически получить строку из TMP_Inputfield.text вместо TMP_Text.text.

0 голосов
/ 19 февраля 2019

Термин поиска должен быть заключен в подстановочный знак %.

Примерно так должно работать:

var results = dbcon.Query<TestSubject>("SELECT * FROM TestTable WHERE first_name LIKE @a", new {a = "%" + searchTerm + "%"});
...