【问题标题】:Getting the schema for a table获取表的架构
【发布时间】:2010-09-15 11:42:41
【问题描述】:

给定一个 SQLConnection 对象,如何获取单个表的架构?

前几天我在尝试这个,我似乎能够从运行查询获得的 DataSet 中获取架构,但是我可以从连接中获得的所有架构信息似乎都与表是可用的,而不是表上的实际详细信息。

我确信有一种简单的方法可以做到这一点。

【问题讨论】:

标签: c# sql sql-server ado.net schema


【解决方案1】:

这段代码会做你想做的事(显然改变表名、服务器名等):

using System;
using System.Collections.Generic;
using System.Text;

using System.Data;
using System.Data.SqlClient;
using System.Data.SqlTypes;

namespace ConsoleApp
{
    class Program
    {
        static void Main(string[] args)
        {
            string query = "SELECT * FROM t where 1=0";
            string connectionString = "initial catalog=test;data source=localhost;Trusted_Connection=Yes";

            DataTable tblSchema;

            using (SqlConnection cnn = new SqlConnection(connectionString))
            {
                using (SqlCommand cmd = cnn.CreateCommand())
                {
                    cmd.CommandText = query;
                    cmd.CommandType = CommandType.Text;
                    cnn.Open();
                    using (SqlDataReader rdr = cmd.ExecuteReader(CommandBehavior.KeyInfo))
                    {
                        tblSchema = rdr.GetSchemaTable();
                    }
                    cnn.Close();
                }
            }
            int numColumns = tblSchema.Columns.Count;
            foreach (DataRow dr in tblSchema.Rows)
            {
                Console.WriteLine("{0}: {1}", dr["ColumnName"], dr["DataType"]);
            }

            Console.ReadLine();
        }
    }
}

【讨论】:

    【解决方案2】:

    我认为从查询中访问架构(通过 GetSchemaTable)是唯一的方法。 如果您只对架构感兴趣,则可以运行不返回任何行的查询(从 1=2 的表中选择 *)。

    您应该使用 KeyInfo CommandBehaviour 来执行源查询,否则不能保证返回的所有信息都是准确的

    Command.ExecuteReader(CommandBehavior.KeyInfo)
    

    【讨论】:

      【解决方案3】:

      SQL Server - 查询目录视图...如果 SQL 2000 或更早版本,则为 sysobjects、syscolumns 等...如果 SQL 2005 或更高版本,则为 sys.objects、sys.columns 等。 (虽然旧视图仍然可用,但建议使用较新的视图)

      此处完整参考: http://msdn.microsoft.com/en-us/library/ms189783.aspx

      例子:

      select so.name, sc.*
      from sys.objects as so
      inner join sys.columns as sc on sc.object_id = so.object_id
      where so.name='some_table'
      

      【讨论】:

      • 我们可以为查询做些什么,而不仅仅是表?例如。 SELECT * FROM Table1 INNER JOIN Table2...
      猜你喜欢
      • 1970-01-01
      • 2010-10-18
      • 2018-11-25
      • 2012-05-28
      • 2022-01-21
      • 1970-01-01
      • 2012-08-29
      • 2021-04-15
      • 2012-06-25
      相关资源
      最近更新 更多