SQLiteConnection 参数化查询 c#

SQLiteConnection parameterized query c#

提问人:NewTech 提问时间:11/15/2023 最后编辑:Joel CoehoornNewTech 更新时间:11/15/2023 访问量:69

问:

我正试图找到解决这个问题的方法,但在任何地方都找不到帮助。 我有一个 SqliteConnection 对象,我正在使用查询选择器传递参数化查询,但找不到任何帮助。

private SqliteConnection dbConn;
var users = dbConn.Query<Users>($"SELECT * FROM {nameof(Users)} WHERE {nameof(Users.Id)} = '{userID}'").FirstOrDefault();

这里 userID 是输入变量。如何使其参数化?

C# SQLITE 准备语句

评论

0赞 NineBerry 11/15/2023
这回答了你的问题吗?使用 C# 在 SQLite 中添加参数
0赞 NewTech 11/15/2023
不幸的是,不,我确实看到了该帖子,但它向命令对象添加了参数,我需要修改连接对象上的查询选择器。
1赞 David 11/15/2023
您是否正在使用特定库中的资源?该供应商是否提供文档?SqliteConnection
2赞 Joel Coehoorn 11/15/2023
连接对象没有现成的本机“查询选择器”。你在用Dapper吗?还是英孚?

答:

0赞 Joel Coehoorn 11/15/2023 #1

不能参数化表名和列名;您可能需要对该部分进行硬编码。另外,在参数化值时,不要包含引号

当我在这里时,由于连接池,尝试重用相同的连接对象也是一种糟糕的做法,因此应该更像是private SqliteConnection dbConn;private string sqliteConnectionString = "...";

因此,假设查询方法将通过 FormattableString 对插值进行自动参数化,我们最终得到:

private string sqliteConnectionString = "...";

using var conn = new SqliteConnection(sqliteConnectionString);
var users = conn.Query<Users>($"SELECT * FROM Users WHERE Id = {userID}").FirstOrDefault();

评论

0赞 NineBerry 11/15/2023
如果这是关于 sqlite-net-pcl,则 Query 方法不支持 FormattableString,但它支持使用问号和其他值参数。看看我的答案。
1赞 NineBerry 11/15/2023 #2

假设您使用的是 sqlite-net-pcl 中的类:

您可以使用问号作为值的占位符,然后将实际值作为附加参数传递:

var user = dbConn.Query<Users>($"SELECT * FROM {nameof(Users)} " +
    $"WHERE {nameof(Users.Id)} = ? " +
    $"OR {nameof(Users.Id)} = ?", userID, alternativeUserID)
    .FirstOrDefault();

文档说:

创建一个给定带有参数的命令文本 (SQL) 的 SQLiteCommand。在每个参数的命令文本中放置一个“?”,然后执行该命令。它使用为给定类型自动生成的映射返回结果的每一行。


还可以使用 LINQ to SQL 从 C# 代码自动生成 sql 查询:

var user = dbConn.Table<Users>().Where(row => row.Id == userID || row.Id == alternativeUserID).FirstOrDefault();

有关更多详细信息,请查看源代码: https://github.com/praeclarum/sqlite-net/blob/master/src/SQLite.cs