Kann ich nach der Verbindung mit der Datenbank den Namen aller Spalten erhalten, die in meinem SqlDataReader
zurückgegeben wurden?Können Sie die Spaltennamen von einem SqlDataReader erhalten?
Antwort
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
oder
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
Es gibt eine GetName
Funktion auf der SqlDataReader
, die den Spaltenindex akzeptiert und den Namen der Spalte zurückgibt.
Umgekehrt gibt es eine GetOrdinal
, die einen Spaltennamen übernimmt und den Spaltenindex zurückgibt.
Warum in aller Welt zu erreichen, ist dies nicht als Antwort markiert? –
Zwei Gründe: Erstens hat das ursprüngliche Poster noch keine Antwort gewählt, und zweitens gibt es andere Antworten, die eine detailliertere Beschreibung der "Lösung" des Problems geben, als nur die Existenz der Funktionalität. Persönlich mag ich die Antwort von Steven Lyons am besten, da es nicht nur über GetName spricht, sondern auch über FieldType und DataType. –
'GetOrdinal' war perfekt. Ich suchte nach "GetName", aber viel sauberere Lösung für mein Problem mit "GetOrdinal". – goodeye
Sie können die Spaltennamen von einem DataReader abrufen.
Hier ist der wichtige Teil:
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
}
Der Link ist tot. – shuttle87
Sicher können.
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(" ");
}
}
Dies ist ursprünglich aus: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
Ich verwende die GetSchemaTable Methode, die über die Schnittstelle IDataReader ausgesetzt ist.
ja hier ist ein Artikel darüber: Abrufen von Schema-Informationen aus dem Datenreader https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx –
Wenn Sie die Spaltennamen nur wollen, können Sie tun:
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"));
}
}
Aber wenn Sie nur eine Zeile benötigen, Ich mag meinen AdoHelper hinaus. Dieser Zusatz ist großartig, wenn Sie eine einzelne Zeilenabfrage haben und Sie nicht mit der Datentabelle in Ihrem Code arbeiten wollen. Es gibt ein case-insensitive Wörterbuch von Spaltennamen und -werten zurück.
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;
}
'werfen Sie ex;' ist eine ungünstigste Praxis. – asawyer
es ist nur ein Beispiel –
Asawyer, sollten Sie zumindest sagen, warum. Ich nehme an, du wirst sagen, du solltest "werfen" benutzen; stattdessen, damit Sie nicht die ursprünglichen Spurspurdetails verlieren. –
Bereits erwähnt. Nur eine LINQ Antwort:
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();
Das zweite ist sauberer und viel schneller. Selbst wenn Sie GetSchemaTable
im ersten Ansatz zwischenspeichern, wird die Abfrage sehr langsam sein.
Gibt es eine Möglichkeit, dies mit Werten zu tun? –
@TravisHeeter Ich verstehe dich nicht. Finde Spaltennamen von Werten von was? – nawfal
Ich meine nur ein Ost-Weg, um die Werte in der Ergebnismenge in eine Liste oder vielleicht die ganze Sache zu einem IEnumerable
eine Erweiterungsmethode verwenden:
public static List<string> ColumnList(this IDataReader dataReader)
{
var columns = new List<string>();
for (int i = 0; i < dataReader.FieldCount; i++)
{
columns.Add(dataReader.GetName(i));
}
return columns;
}
Es ist einfacher, es in SQL
var columnsList = dbContext.Database.SqlQuery<string>("SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = 'SCHEMA_OF_YOUE_TABLE' AND TABLE_NAME = 'YOUR_TABLE_NAME'").ToList();
- 1. größten Spaltennamen erhalten, die
- 2. So erhalten Sie den Tabellennamen einer Spalte aus SqlDataReader
- 3. Wählen Sie Spaltennamen, die nicht null sein können
- 4. So ändern Sie die Spaltennamen von VBA
- 5. Erhalten Sie Spaltennamen in HBase Thrift C++?
- 6. Erhalten Sie Excel-Style Spaltennamen aus Spaltennummer
- 7. Die beste Methode zum Füllen von DataSet aus einem SQLDataReader
- 8. Wie Spaltennamen erhalten, die aktualisiert worden
- 9. Wie Float-Wert mit SqlDataReader erhalten?
- 10. SqlDataReader ist Tropfen Spalten nach dem Zufallsprinzip!
- 11. C# Wie geben Sie das Dataset von sqldatareader zurück?
- 12. VB.NET DataGridView lädt Daten von einem Hintergrund-Worker und SQLDataReader
- 13. Howto die UI Benachrichtigen während Datensätze mit einem SqlDataReader
- 14. SqlDataReader Spalten-Ordinalzahlen
- 15. Weisen Sie einem neuen leeren Datenrahmen Spaltennamen aus Spaltennamen von 2 verschiedenen Datenrahmen in R
- 16. Ändern von DateTimeMode mit SQLDataReader
- 17. Wie erhalten Sie die Spaltennamen beim Importieren von Daten mit numpy?
- 18. Wie können Sie die ausgewählten Zeilen von einem UITableView abrufen?
- 19. Wie können Sie png8 von einem PNG24
- 20. Wie erhalten Sie Spaltennamen der Tabelle zur Laufzeit in C#?
- 21. DataReader zu .CSV mit Spaltennamen
- 22. Können Sie die tatsächlichen Unterschiede zwischen zwei Git-Commits erhalten?
- 23. Erhalten Sie die Ergebnisse von sp_helptext als eine einzelne Zeichenfolge
- 24. SqlDataReader Leistung
- 25. Können Sie von einem Context Manager "brechen"?
- 26. Warum die GetOrdinal verwenden() Methode des SqlDataReader
- 27. Setzen Sie die Spaltennamen beim Stapeln von Pandas DataFrame
- 28. Wie können Sie eine TensorFlow-Saite erhalten?
- 29. SqlDataReader get specific ResultSet
- 30. So erhalten Sie die ausgewählte Zeile von einem TreeView
Es ist verrückt, dass es keine aufzählbare Schnittstelle gibt, mit der Sie durch die Spalten iterieren können. – JohnFx
Etwas kürzer: 'columns = Enumerable.Range (0, reader.FieldCount) \t \t .Wählen Sie (reader.GetName) .ToList();' – Alex
Das funktioniert großartig.Ich fand auch heraus, dass meine Spaltennamen in Großbuchstaben geschrieben waren, es sei denn, ich verwendete den Namen der Spalte in Anführungszeichen. 'SELECT ID AS" MyId "FROM Tabelle;' – styfle