是否可以将表名作为参数传递给Dapper Query命令?我不是在寻找SQL表定义的函数或SQL表变量。我想在C#中定义表名并将其传递给Dapper。这是我的代码,执行时返回错误Must declare the table variable "@TableName"
var foo = conn.Query("SELECT * FROM @TableName WHERE Id = @Id", new { TableName = "MyTable", Id = 123 });
答案 0 :(得分:17)
SQL不支持参数化表名,而dapper是一个非常非常薄的SQL包装器 - 所以:no。
但是,您可以使用string.format:
string sql = string.Format("... from [{0}] ...", table name);
请注意,即使使用[/],这也会产生固有的SQL注入风险。
答案 1 :(得分:0)
对于内部通用脚本,我们使用TableNameMapper来构建sql:
public async Task<bool> DeleteAsync(int id)
{
string tableName = Dapper.Contrib.Extensions.SqlMapperExtensions.TableNameMapper(typeof(T));
using (var conn = new SqlConnection(ConnectionString))
{
int affectedRows = await conn.ExecuteAsync($"delete from {tableName} where id=@id", new { id });
return affectedRows > 0;
}
}
答案 2 :(得分:0)
您可以检查表是否首先存在以防止Sql注入:
string tableNameExistsCheck = "SELECT count(1) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = @tableName";
if (c.QuerySingle<int>(tableNameExistsCheck, new { tableName }) == 1)
{
string sql = string.Format("... from [{0}] ...", tableName);
var result = c.Query(sql);
}