Bla*_*man 265 c# ado.net sqldatareader
连接到数据库后,我可以获取在我的所有列中返回的列的名称SqlDataReader
吗?
Rob*_*ett 436
var reader = cmd.ExecuteReader();
var columns = new List<string>();
for(int i=0;i<reader.FieldCount;i++)
{
columns.Add(reader.GetName(i));
}
Run Code Online (Sandbox Code Playgroud)
要么
var columns = Enumerable.Range(0, reader.FieldCount).Select(reader.GetName).ToList();
Run Code Online (Sandbox Code Playgroud)
Ste*_*ton 77
它上面有一个GetName
函数SqlDataReader
接受列索引并返回列的名称.
相反,有一个GetOrdinal
接受列名并返回列索引.
Ste*_*ons 42
您可以从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
}
Run Code Online (Sandbox Code Playgroud)
naw*_*fal 15
已经提到了.只是一个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();
Run Code Online (Sandbox Code Playgroud)
第二个更清洁,更快.即使您GetSchemaTable
在第一种方法中缓存,查询也会非常缓慢.
如果只需要列名,可以执行以下操作:
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"));
}
}
Run Code Online (Sandbox Code Playgroud)
但如果你只需要一行,我喜欢我的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;
}
Run Code Online (Sandbox Code Playgroud)
使用扩展方法:
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;
}
Run Code Online (Sandbox Code Playgroud)
对我来说,我会写一个这样的扩展方法:
public static string[] GetFieldNames(this SqlDataReader reader)
{
return Enumerable.Range(0, reader.FieldCount).Select(x => reader.GetName(x)).ToArray();
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
212357 次 |
最近记录: |