SqlDataAdapter.FillSchema() 方法不起作用

SqlDataAdapter.FillSchema() method doesn't work

我执行以下操作:

SqlConnection conn = new SqlConnection("... my connection string ...");

dataAdapter = new SqlDataAdapter();

SqlCommand selectCommand = new SqlCommand("select * from items", conn);
dataAdapter.SelectCommand = selectCommand;

DataTable schemaTable = new DataTable();
dataAdapter.FillSchema(schemaTable, SchemaType.Source);

但是,schemaTable 中没有行。 dataAdapter.Fill() 工作。

FillSchema 方法使用 SelectCommand 从数据库中检索模式。 FillSchema 创建一个具有 PrimaryKey 和 Constraints 属性的 DataTable,将列添加到 DataColumnCollection 并配置必要的 DataColumn 属性。此方法不会用行填充数据表,它只应用模式。使用 Fill 方法来做到这一点。

我认为你误解了 FillSchema 的作用。

它采用传入的 DataTable(没有行也没有列)并构建架构,添加包含大小、类型等信息的列...对应于将返回的 table SelectCommand.
它不会用记录填充传入的 table。

事实上,如果您在调用 FillSchema 后查看列数,您会发现您的 schemaTable 已 'built' 与 items table.

那么,FillSchema 调用有什么用,考虑到 Fill 调用同样用其列名称和类型填充 table?好吧,FillSchema 用于为下面的 Fill 传入的 table 准备一些属性,否则 Fill 调用不会加载这些属性。例如,假设您的 items table 有一个 AutoIncrement 列。在调用 Fill 之后,此 属性 在匹配的 DataColumn 上不可用。但是,如果您传递给 Fill,FillSchema 准备的 table,则 属性 可用。

如果您只想要有关 table 列的信息,则需要不同的方法

using(SqlConnection con = new SqlConnection(.......)
{
    con.Open();
    DataTable schema = con.GetSchema("Columns", new string[] {null, null, "items"});
    foreach(DataRow row in schema.Rows)
        Console.WriteLine("TABLE:" + row.Field<string>("TABLE_NAME") + 
                          " COLUMN:" + row.Field<string>("COLUMN_NAME"));
}

或者更标准的方式

using(SqlConnection con = new SqlConnection(.......)
{
    con.Open();
    DataTable dt = new DataTable();
    SqlCommand cmd = new SqlCommand(@"SELECT * FROM INFORMATION_SCHEMA.COLUMNS 
                                      WHERE TABLE_NAME='items' 
                                      AND TABLE_CATALOG = 'yourDBNameHere'", con);
    SqlDataReader reader = cmd.ExecuteReader();
    dt.Load(reader);
    foreach(DataRow row in dt.Rows)
      ..... catalog, name, ordinal_position, column_default etc....
}