数据库
首页 > 数据库> > 首页> C#> DataReader的获取类型规范的SQL Server

首页> C#> DataReader的获取类型规范的SQL Server

作者:互联网

我有一个小程序可以将数据库表“下载”到Excel.

我想将列类型添加到第二行,并使用以下函数进行了尝试.它工作正常,但GetDataTypeName(i)仅返回int,nvarchar,但我需要像这样的完整类型规范

nvarchar(255), decimal(19, 8)

是否有另一个功能可以从数据库中获取此信息?

SqlDataReader dataReader = command.ExecuteReader();

// adds the names and the types if the table has no values
if (!dataReader.HasRows || !withValues)
{
    for (int i = 0; i < dataReader.FieldCount; i++)
    {
        names.Add(dataReader.GetName(i));
        types.Add(dataReader.GetDataTypeName(i));
    }
}

解决方法:

此类信息可通过调用GetSchemaTable获得.它返回一个DataTable,其中查询所返回的每一列都有一行.该表的每一列都描述了由元数据相对于查询字段提取的特定信息

例如

    SqlDataReader dataReader = command.ExecuteReader();

    if (!dataReader.HasRows || !withValues)
    {
        DataTable dt = dataReader.GetSchemaTable();
        foreach(DataRow row in dt.Rows)
        {
            Console.WriteLine("ColumnName: " + row.Field<string>("ColumnName"));
            Console.WriteLine("NET Type: " + row.Field<string>("DataTypeName"));
            Console.WriteLine("Size: " + row.Field<int>("ColumnSize"));
        }
   }

GetSchemaTable返回有关表/查询的许多信息,但是其中许多字段设置为null.我不确定这是否是提供程序的限制,或者它们是否为null,因为在调用的上下文中,它们没有任何意义.无论如何都要使用防御性编程来访问这些值(如果!(value == DBNull.Value)

标签:ado-net,c,sql-server
来源: https://codeday.me/bug/20191118/2025022.html