提问人:NewTech 提问时间:11/15/2023 最后编辑:Joel CoehoornNewTech 更新时间:11/15/2023 访问量:69
SQLiteConnection 参数化查询 c#
SQLiteConnection parameterized query c#
问:
我正试图找到解决这个问题的方法,但在任何地方都找不到帮助。 我有一个 SqliteConnection 对象,我正在使用查询选择器传递参数化查询,但找不到任何帮助。
private SqliteConnection dbConn;
var users = dbConn.Query<Users>($"SELECT * FROM {nameof(Users)} WHERE {nameof(Users.Id)} = '{userID}'").FirstOrDefault();
这里 userID 是输入变量。如何使其参数化?
答:
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
评论
SqliteConnection