【问题标题】:Sqlite Like query xamarin formsSqlite Like 查询 xamarin 表单
【发布时间】:2018-08-16 12:34:19
【问题描述】:

我正在尝试在 xamarin 中点赞,但是查询返回给我的只是一个数字,我已经在 DBowser sqlite 中对其进行了测试,并且它可以工作,但在这里不行。 会出现什么错误?

查询

public Task<Produtos> GetProdutosAsyncBy(String searchField)
{
    string searchNoSpaces = searchField.Replace(" ", "%");
    var get_docnumb = database.ExecuteScalarAsync<Produtos>("SELECT *" +
                      " FROM Produtos WHERE Design LIKE '%" + searchNoSpaces + "%'");

    return get_docnumb;   
}

来电查询

public async void SearchProdutoQuery ()
{
    var qwe = App.Database.GetProdutosAsyncBy(searchBar_produtos.Text).Result;
}

【问题讨论】:

  • 这就是执行标量的作用——它返回一个值,即第一个结果集第一行的第一列。
  • 因为您使用的是 ExecuteScalar。很好,你有这个错误,因为你的代码容易受到 SQL 注入攻击。代替字符串连接使用参数。
  • @CetinBasoz 是的,我知道,这是一个测试,但错误是因为我没有使用参数?
  • 不,已经说过这是因为您使用 ExecuteScalar 要求单个值。尝试改用 ExecuteDbDataReader 或 ExecuteReader。恕我直言,使用 Linq 会更容易。
  • @CetinBasoz 但 SQLiteAsyc 不包含 ExecuteReader 或 ExecuteDbDataReader

标签: c# sqlite xamarin xamarin.forms


【解决方案1】:

您可以使用 Scalar 返回如下内容:

public int GetCountProdutosAsyncBy(String searchField)
{

    string searchNoSpaces = searchField.Replace(" ", "%");
    var get_docnumb = database.ExecuteScalarAsync<Produtos>("SELECT COUNT(*) FROM Produtos WHERE Design LIKE '%" + searchNoSpaces + "%'");

    return get_docnumb;

}

但是要解决你不能使用Scalar的问题,你需要QUERY并且为了避免SQL注入你应该使用参数:

public Task<Produtos> GetProdutosAsyncBy(String searchField)
{

    string searchNoSpaces = searchField.Replace(" ", "%");
    var get_docnumb = database.Query<Produtos>("SELECT * FROM Produtos WHERE Design LIKE ?", "%" + searchNoSpaces + "%");

    return get_docnumb;

}

【讨论】:

    猜你喜欢
    • 2018-06-15
    • 2021-01-13
    • 2015-08-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多