Sau khi kết nối với cơ sở dữ liệu, tôi có thể lấy tên của tất cả các cột được trả lại trong số SqlDataReader
không?Bạn có thể lấy tên cột từ SqlDataReader không?
Trả lời
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
hoặc
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
Có chức năng GetName
trên SqlDataReader
chấp nhận chỉ mục cột và trả về tên của cột.
Ngược lại, có một GetOrdinal
có tên cột và trả về chỉ mục cột.
Tại sao trên trái đất không này đánh dấu là câu trả lời? –
Hai lý do: đầu tiên, áp phích ban đầu chưa chọn câu trả lời và thứ hai, có các câu trả lời khác cung cấp mô tả chi tiết hơn về 'giải pháp' của vấn đề sau đó chỉ là sự tồn tại của chức năng. Cá nhân, tôi thích câu trả lời của Steven Lyons là tốt nhất vì nó không chỉ nói về GetName mà còn đi vào FieldType và DataType. –
'GetOrdinal' là hoàn hảo. Tôi đã tìm kiếm 'GetName', nhưng giải pháp sạch hơn cho vấn đề của tôi với' GetOrdinal'. – goodeye
Bạn có thể lấy tên cột từ DataReader.
Đây là phần quan trọng:
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
}
Liên kết đã chết. – shuttle87
Bạn chắc chắn có thể.
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(" ");
}
}
Đây là có nguồn gốc từ: http://www.dotnetjunkies.ddj.com/Article/B82A22D1-8437-4C7A-B6AA-C6C9BE9DB8A6.dcik
tôi sử dụng phương pháp GetSchemaTable, được tiếp xúc thông qua giao diện IDataReader.
có đây là một bài viết về nó: Lấy thông tin lược đồ từ bộ dữ liệu https://msdn.microsoft.com/en-us/library/haa3afyz(v=vs.110).aspx –
Nếu bạn muốn chỉ các tên cột, bạn có thể làm:
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"));
}
}
Nhưng nếu bạn chỉ cần một dòng, tôi thích Ngoài AdoHelper tôi. Bổ sung này là rất tốt nếu bạn có một truy vấn một dòng và bạn không muốn đối phó với bảng dữ liệu trong mã của bạn. Nó trả về một từ điển không phân biệt dạng chữ của các tên cột và các giá trị.
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;' là thực tiễn tồi tệ nhất. – asawyer
chỉ là một ví dụ –
Asawyer, ít nhất bạn cũng nên nói tại sao. Tôi cho rằng bạn sẽ nói rằng bạn nên sử dụng "ném"; thay vào đó để bạn không bị mất chi tiết dấu vết gốc. –
Đã được đề cập. Chỉ cần một câu trả lời là 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();
Cách thứ hai sạch hơn và nhanh hơn nhiều. Ngay cả khi bạn cache GetSchemaTable
trong phương pháp đầu tiên, truy vấn sẽ rất chậm.
Có cách nào để thực hiện điều này với Giá trị không? –
@TravisHeeter Tôi không hiểu bạn. Tìm tên cột từ các giá trị của cái gì? – nawfal
Tôi có nghĩa là chỉ là một cách phía đông để có được các giá trị trong tập kết quả vào một danh sách, hoặc có lẽ là toàn bộ một đối tượng IEnumerable
Sử dụng một phương pháp khuyến nông:
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;
}
Nó là dễ dàng hơn để đạt được điều đó trong 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. Lấy tên cột từ java.sql.ResultSet
- 2. Cách lấy tên cột từ GridView?
- 3. Hive - lấy tên cột
- 4. Lấy tên cột trong thực thể doctrine2
- 5. lấy tên cột cho bảng cụ thể
- 6. Lấy một cột từ một thực thể
- 7. Lấy tên cột
- 8. Lấy tên cột trong jpa
- 9. LINQ: Lấy Tên Cột Bảng
- 10. lấy tên cột từ kết quả truy vấn bằng pymssql
- 11. Số cột Excel từ tên cột
- 12. Trong BASH, bạn có thể lấy tên hàm trong phần thân hàm không?
- 13. Bạn có thể chỉ định số cột trong read.table không?
- 14. Tìm bàn khi bạn biết tên cột?
- 15. Cách lấy Giá trị cột cụ thể từ một DataTable?
- 16. Có thể lấy được từ System.ArgumentException không?
- 17. PHPExcel lấy tên cột tương ứng với cột được nêu
- 18. Tôi có thể lấy thông tin về bảng, cột và loại từ mô hình không?
- 19. Lấy tên cột trong bảng mysql?
- 20. Chọn các cột có tên cột cụ thể trong PostgreSQL
- 21. Cách lấy Tên cá thể từ cá thể trong AWS?
- 22. Trong vb.net, làm cách nào để lấy tên cột từ một dữ liệu có thể cân bằng
- 23. Tôi có thể lấy PTypeInfo từ một chuỗi không?
- 24. Cách lấy kết quả từ hàng MySQL có nhiều cột cùng tên với PHP?
- 25. Có thể lấy "mọi thứ" từ javax.naming.InitialContext không?
- 26. Java ResultSet - lấy tên cột dựa trên Chỉ số
- 27. Bạn có nên sử dụng bí danh cột có hoặc không có từ khóa AS không?
- 28. Có cách nào để đa luồng SqlDataReader không?
- 29. Lấy tên tháng từ số trong PostgreSQL
- 30. Bạn có thể đặt tên một thể hiện giống với tên hàm tạo của nó không?
Thật điên rồ khi không có giao diện đếm được cho phép bạn lặp qua các cột. – JohnFx
Ngắn hơn một chút: 'cột = Enumerable.Range (0, reader.FieldCount) \t \t .Chọn (reader.GetName) .ToList();' – Alex
Công trình này tuyệt vời.Tôi cũng phát hiện ra rằng tên cột của tôi là tất cả các chữ hoa, trừ khi tôi sử dụng dấu ngoặc kép xung quanh tên cột. 'SELECT id AS" MyId "FROM table;' – styfle