从一个表中读取,我不知道表的结构

本文关键字:读取 我不知道 结构 一个 | 更新日期: 2023-09-27 18:19:25

我有一个连接到数据库视图(SQL Server 2008 R2)。但是我不知道其中任何一列。我需要选择视图上的所有内容。我如何通过使用SqlDataReader来做到这一点?

SqlConnection con = new SqlConnection(conString);
con.Open();
SqlCommand command = new SqlCommand("select * from vw_Haber_Baslik_Ozet", con);
SqlDataReader reader = command.ExecuteReader();
while (reader.Read())
{
    //reader.get?? I will write the things I get to a file
}
reader.Close();
con.Close();
一旦我了解了这个视图的结构,我就可以创建一个合适的类来存储这些值。但是我怎么学习它的结构呢?

从一个表中读取,我不知道表的结构

如果你把这个读入数据集,你可以使用DataTable来遍历列或行等:

        SqlConnection con = new SqlConnection(conString);
        con.Open();
        SqlCommand command = new SqlCommand("select * from vw_Haber_Baslik_Ozet", con);
        SqlDataAdapter adapter = new SqlDataAdapter(command.CommandText, con);
        DataSet ds = new DataSet();
        adapter.Fill(ds);
        foreach (DataColumn dc in ds.Tables[0].Columns)
        {
            String colName = dc.ColumnName;
            String valueOfCol1 = ds.Tables[0].Rows[0][dc.ColumnName].ToString();
        }
        con.Close();

如果只是希望能够掌握返回表的样子,您可能最好先将数据加载到数据集中,并在填充数据集后设置断点,以便您可以检查它:

using (var connection = new SqlConnection(conString))
{
     var command = new SqlCommand(..., connection);
     var apapter - new SqlDataAdapter(command);
     var ds = new DataSet();
     connection.Open();
     adapter.Fill(ds);
     if (ds.Tables.Count >= 1)  <<--  Set a breakpoint here and inspect the dataset
     {
        ...
     }
}

SqlDataReader有一个名为FieldCount的属性,它返回一行中的列数。如果您迭代执行GetName()方法的列数,并将列数作为参数传递,那么您可能可以这样做。

两个选项:

读取所有数据

DataTable dt = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(command);
da.Fill(dt);

或使用GetSchemaTables

DataTable schema;
SqlDataReader reader = command.ExecuteReader();
schema = reader.GetSchemaTable();

第一个方法需要加载数据,而第二个方法返回一个数据表,其中每行包含表

单列上的所有可用信息。

如果你只想知道列和类型

Select * from [YourTable Or View] where 1=0

使用DataAdapter填充数据表

然后通过程序或手表读取表。

如果你使用模式方法(GetSchemaTables),你会得到更多(你可能想要,也可能不想要)——可空性、约束、标识等