有没有办法从SQL语句中获取列名?

时间:2019-08-16 08:35:07

标签: c# sql dapper relation

我正在使用Dapper,我想从运行时提供的SQL语句中获取所有列名。从数据库返回的关系是否为空无关紧要。

public async Task<List<string>> GetColumnsFromSQLStatement(string sqlStatement)
{
    List<string> Columns = new List<string>();

    using (var con = SourceDatabaseConnectionFactory.GetConnection())
    {
        using (var dbTrans = SourceTransactionFactory.CreateTransaction(con, TransactionOptions.ReadOnly))
        {
            DynamicParameters para = new DynamicParameters();

            var tmp = con.QueryAsync(sqlStatement, para, dbTrans,  100,  CommandType.Text);
            /*build the column string list?*/

            dbTrans.Commit();
        }
    }

    return Columns;
}

我希望我可以提供一个带有列名的字符串列表。

2 个答案:

答案 0 :(得分:0)

使用非通用Query[Async] API时,每一行都可以强制转换为IDictionary<string, object>,从而可以访问名称。或者,使用返回数据读取器的API。

答案 1 :(得分:0)

我找到了一种解决方案,无需在sql语句的结果关系中获得任何记录即可获取列名:

 public async Task<List<string>> GetColumnsFromSQLStatement(string sqlStatement)
    {
        List<string> Columns = new List<string>();

        using (var con = SourceDatabaseConnectionFactory.GetConnection())
        {
            using (var dbTrans = SourceTransactionFactory.CreateTransaction(con, TransactionOptions.ReadOnly))
            {
                DynamicParameters para = new DynamicParameters();

                var tmp = con.ExecuteReader(sqlStatement, para, dbTrans, 100, CommandType.Text);
                var schema = tmp.GetSchemaTable();
                for (var i = 0; i < schema.Rows.Count; i++)
                {
                    Columns.Add(schema.Rows[i]["columnName"].ToString());
                }
                dbTrans.Commit();
            }
        }

        return Columns;
    }

因此,您可以使用例如存储的生产者和职能部门。