微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

c# – SqlDataAdapter.FillSchema()方法不起作用

我做以下事情:

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的作用.

它传入DataTable(没有行和没有列)并构建模式,添加有关大小,类型等的信息的列…对应于SelectCommand将返回的表.
它没有用记录填充传入的表.

事实上,如果在调用FillSchema之后查看Columns计数,您会发现schemaTable已经使用与items表匹配的列“构建”.

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

如果您只想要关于表格列的信息,则需要采用不同的方法

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....
}

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐