将表名作为参数传递给Dapper

时间:2014-07-29 14:20:43

标签: dapper

是否可以将表名作为参数传递给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 });

3 个答案:

答案 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);                    
}