回答:
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();
2つ目はよりクリーンで高速です。GetSchemaTable
最初のアプローチでキャッシュしたとしても、クエリは非常に遅くなります。
reader.Cast<IDataRecord>().ToList()
。dynamic
代わりにキーワードを使用できますIDataRecord
が、メリットはありません。DataTable
は、1回限りの読み込みを容易にするように設計されているため、それを使用することもできますが、オンデマンドで読み込むことの利点は失われます(データリーダーを使用すると、いつでも読み込みを停止できます)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"));
}
}
しかし、行が1つだけ必要な場合は、AdoHelperの追加が好きです。この追加は、1行のクエリがあり、コードでデータテーブルを処理したくない場合に最適です。列名と値の大文字と小文字を区別しない辞書を返します。
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