我希望从给定sql连接的 sql select语句获取列及其数据类型。代码应该能够连接不同的RDBMS(sql server,My sql,Oracle,Etc等)。 。)
例如
1.select * from People
2.select Name As UserName,Id As Identity,Address from People
必填结果:
1.Name-string, Id-int, Address-string
2.UserName-string ,Identity-int, Address-string
答案 0 :(得分:1)
如果您可以在c#中的DataTable中获取select语句结果,我将尝试这样做:
DataTable table = GetDataTable();
foreach (DataColumn column in table.Columns)
{
var name = column.ColumnName; // the column name
var type = column.DataType.ToString(); // the type as string
}
希望它有所帮助。
答案 1 :(得分:1)
当我遇到同样的问题时,我尝试了目前存在的两个答案,但两者在某些条件下都无法正常工作。例如,它们不能将DateTime
与Date
区分开来,不能返回某些数据类型的大小(例如decimal(38,10)
),不支持某些SQL本机类型,例如{ {1}}等等。最后我得到了以下解决方案:
Money
var schema = yourSqlCommand.ExecuteReader().GetSchemaTable();
var Columns = schema.Rows.Cast<DataRow>().Select(row=>new DbColumnInfo
{
Name = row.Field<string>("ColumnName"),
SqlDataType = GetSqlTypeFromSchemaRow(row) //extract information about SQL type which I need, using schemaRow.Field<string>("DataTypeName"), schemaRow.Field<short>("NumericPrecision"), schemaRow.Field<short>("NumericScale") etc.
}).ToArray();
函数返回的SQL表不包含您选择的数据,而是包含有关它的列的元数据(名称,SQL类型,可空性,标识参数,主键标记等等)。请参阅完整的专栏说明here。
我只在MS SQL Server中使用它,但基类中存在方法GetSchemaTable()
和ExecuteReader()
,所以我相信这几乎适用于任何SQL提供程序。
对于支持的SQL语句 - 看起来像是返回单个数据集的任何SQL。我尝试了连接,计算列,存储过程和函数。
答案 2 :(得分:0)
对于SQL Server:
看看this article about loading data into a DataSet。
您还可以查看DataSet上的FillSchema方法以加载架构信息。
完成后,您可以遍历列及其类型。
dataSet.Table["SomeTable"].Columns