답변:
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
또는
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
columns = Enumerable.Range(0, reader.FieldCount) .Select(reader.GetName).ToList();
SELECT id AS "MyId" FROM table;
에 GetName
기능이 있습니다SqlDataReader
열 인덱스를 허용하고 열 이름을 반환 .
반대로 GetOrdinal
열 이름을 가져와 열 인덱스를 반환하는가 있습니다.
GetOrdinal
완벽했다. 에 GetName
대한 문제가 있지만 더 깨끗한 솔루션을 찾고있었습니다 GetOrdinal
.
DataReader에서 열 이름을 가져올 수 있습니다.
중요한 부분은 다음과 같습니다.
for (int col = 0; col < SqlReader.FieldCount; col++)
{
Console.Write(SqlReader.GetName(col).ToString()); // Gets the column name
Console.Write(SqlReader.GetFieldType(col).ToString()); // Gets the column type
Console.Write(SqlReader.GetDataTypeName(col).ToString()); // Gets the column database type
}
이미 언급했습니다. 그냥 LINQ의 대답 :
var columns = reader.GetSchemaTable().Rows
.Cast<DataRow>()
.Select(r => (string)r["ColumnName"])
.ToList();
//Or
var columns = Enumerable.Range(0, reader.FieldCount)
.Select(reader.GetName)
.ToList();
두 번째는 더 깨끗하고 훨씬 빠릅니다. GetSchemaTable
첫 번째 접근 방식으로 캐시하더라도 쿼리 속도가 매우 느려집니다.
reader.Cast<IDataRecord>().ToList()
있습니다. dynamic
키워드 대신 키워드를 사용할 수 IDataRecord
있지만 아무런 이점이 없다고 생각합니다 . DataTable
일회성 로딩을 용이하게하도록 설계되었으므로이를 사용할 수도 있지만 요청시 로딩의 이점을 잃을 수 있습니다 (데이터 리더를 사용하면 언제든지로드를 중단 할 수 있음) var dt = new DataTable(); dt.Load(reader); return dt.AsEnumerable().ToList();
. 이것을 자동화 할 수있는 많은 라이브러리가 있습니다. 여기에서 그것들을 찾으십시오. stackoverflow.com/questions/11988441 그리고 여기에서 stackoverflow.com/questions/1464883
reader.Cast<IEnumerable<dynamic>>
하고 .Cast<dynamic>
있지만,라고 Cannot convert method group 'Cast' to non-delegate type 'dynamic'. Did you intend to invoke the method?
내가 잘못이 무슨 짓을? (나는 당신의 출처를 보았지만 열 이름을 알아야합니다.)
열 이름 만 원하는 경우 다음을 수행 할 수 있습니다.
List<string> columns = new List<string>();
using (SqlDataReader reader = cmd.ExecuteReader(CommandBehavior.SchemaOnly))
{
DataTable dt = reader.GetSchemaTable();
foreach (DataRow row in dt.Rows)
{
columns.Add(row.Field<String>("ColumnName"));
}
}
그러나 한 행만 필요하면 AdoHelper 추가 기능이 좋습니다. 이 추가는 단일 행 쿼리가 있고 코드에서 데이터 테이블을 처리하지 않으려는 경우에 좋습니다. 열 이름과 값의 대소 문자를 구분하지 않는 사전을 반환합니다.
public static Dictionary<string, string> ExecuteCaseInsensitiveDictionary(string query, string connectionString, Dictionary<string, string> queryParams = null)
{
Dictionary<string, string> CaseInsensitiveDictionary = new Dictionary<string, string>(StringComparer.OrdinalIgnoreCase);
try
{
using (SqlConnection conn = new SqlConnection(connectionString))
{
conn.Open();
using (SqlCommand cmd = new SqlCommand())
{
cmd.Connection = conn;
cmd.CommandType = CommandType.Text;
cmd.CommandText = query;
// Add the parameters for the SelectCommand.
if (queryParams != null)
foreach (var param in queryParams)
cmd.Parameters.AddWithValue(param.Key, param.Value);
using (SqlDataReader reader = cmd.ExecuteReader())
{
DataTable dt = new DataTable();
dt.Load(reader);
foreach (DataRow row in dt.Rows)
{
foreach (DataColumn column in dt.Columns)
{
CaseInsensitiveDictionary.Add(column.ColumnName, row[column].ToString());
}
}
}
}
conn.Close();
}
}
catch (Exception ex)
{
throw ex;
}
return CaseInsensitiveDictionary;
}
throw ex;
최악의 연습입니다.
IDataReader 인터페이스를 통해 노출되는 GetSchemaTable 메서드를 사용합니다 .
당신은 할 수 있습니다.
protected void GetColumNames_DataReader()
{
System.Data.SqlClient.SqlConnection SqlCon = new System.Data.SqlClient.SqlConnection("server=localhost;database=northwind;trusted_connection=true");
System.Data.SqlClient.SqlCommand SqlCmd = new System.Data.SqlClient.SqlCommand("SELECT * FROM Products", SqlCon);
SqlCon.Open();
System.Data.SqlClient.SqlDataReader SqlReader = SqlCmd.ExecuteReader();
System.Int32 _columncount = SqlReader.FieldCount;
System.Web.HttpContext.Current.Response.Write("SqlDataReader Columns");
System.Web.HttpContext.Current.Response.Write(" ");
for ( System.Int32 iCol = 0; iCol < _columncount; iCol ++ )
{
System.Web.HttpContext.Current.Response.Write("Column " + iCol.ToString() + ": ");
System.Web.HttpContext.Current.Response.Write(SqlReader.GetName( iCol ).ToString());
System.Web.HttpContext.Current.Response.Write(" ");
}
}
원래 : http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik