C# 有没有办法从SQL语句中获取列名?
我使用的是Dapper,我想从运行时提供的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
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)(我不在电脑前检查)