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

C# 有没有办法从SQL语句中获取列名?,c#,sql,dapper,relation,C#,Sql,Dapper,Relation,我使用的是Dapper,我想从运行时提供的SQL语句中获取所有列名。从数据库返回的结果关系是否为空并不重要 public async Task<List<string>> GetColumnsFromSQLStatement(string sqlStatement) { List<string> Columns = new List<string>(); using (var con = SourceDatabaseConnect

我使用的是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;
}
公共异步任务GetColumnsFromSQLStatement(字符串sqlStatement) { 列表列=新列表(); 使用(var con=SourceDatabaseConnectionFactory.GetConnection()) { 使用(var dbTrans=SourceTransactionFactory.CreateTransaction(con,TransactionOptions.ReadOnly)) { DynamicParameters para=新的DynamicParameters(); var tmp=con.QueryAsync(sqlStatement,para,dbTrans,100,CommandType.Text); /*生成列字符串列表*/ dbTrans.Commit(); } } 返回列; }
我希望我可以提供一个带有列名的字符串列表。

当使用非通用的
查询[Async]
API时,每一行都可以转换为
IDictionary
,从而提供对名称的访问。或者,使用返回数据读取器的API。

当使用非通用的
查询[Async]
API时,可以将每一行转换为
IDictionary
,从而提供对名称的访问。或者,使用返回数据读取器的API。

我找到了一种解决方案,可以在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;
    }
公共异步任务GetColumnsFromSQLStatement(字符串sqlStatement) { 列表列=新列表(); 使用(var con=SourceDatabaseConnectionFactory.GetConnection()) { 使用(var dbTrans=SourceTransactionFactory.CreateTransaction(con,TransactionOptions.ReadOnly)) { DynamicParameters para=新的DynamicParameters(); var tmp=con.ExecuteReader(sqlStatement,para,dbTrans,100,CommandType.Text); var schema=tmp.GetSchemaTable(); 对于(var i=0;i
因此,您可以使用存储的producer和函数来构建复杂的语句。

我找到了一种解决方案,可以获得列名,而不必在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;
    }
公共异步任务GetColumnsFromSQLStatement(字符串sqlStatement) { 列表列=新列表(); 使用(var con=SourceDatabaseConnectionFactory.GetConnection()) { 使用(var dbTrans=SourceTransactionFactory.CreateTransaction(con,TransactionOptions.ReadOnly)) { DynamicParameters para=新的DynamicParameters(); var tmp=con.ExecuteReader(sqlStatement,para,dbTrans,100,CommandType.Text); var schema=tmp.GetSchemaTable(); 对于(var i=0;i
因此,您可以使用存储的producer和函数来构建复杂的语句。

注意:这里只传入一个
字符串(不带args),这让我担心您将面临SQL注入风险。注意:只传入一个
字符串(不带args)这让我担心您将面临SQL注入风险。与我的firebird连接不起作用:var tmp=con.ExecuteReader(sqlStatement,para,dbTrans,100,CommandType.Text);var tmp2=tmp.GetSchemaTable().Columns;foreach(tmp2中的DataColumn dc){Columns.Add(dc.ColumnName);}你有没有一个例子?@RHofmann Data reader有一个直接的API来获取列名-类似GetName(int)的东西(我不在电脑前检查)不适用于我的firebird连接:var tmp=con.ExecuteReader(sqlStatement,para,dbTrans,100,CommandType.Text);var tmp2=tmp.GetSchemaTable().Columns;foreach(tmp2中的DataColumn dc){Columns.Add(dc.ColumnName);}你有没有举个例子?@RHofmann Data reader有一个直接的API来获取列名,比如GetName(int)(我不在电脑前检查)