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....
}
我执行以下操作:
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....
}