检索SQL Server中的表的DataTable信息

时间:2010-10-15 12:40:57

标签: c# sql-server datatable schema foreign-key-relationship

我需要获取列名,主键,外键和其他架构信息。 DataTable类似乎包含所有这些。

以下是我目前获得的当前代码。有了它,我可以检索除外键之外的所有信息。我希望它们能在DataTable.Constraints中定义,但事实并非如此。这是我目前的代码:

    private static DataTable LoadSchemaInfo(string tableName, SqlConnection connection)
    {
        string cmdText = "SELECT * FROM [" + tableName + "] WHERE 1 = 0";

        // Create a SqlDataAdapter to get the results as DataTable
        var sqlDataAdapter = new SqlDataAdapter(cmdText, connection);

        // Create a new DataTable
        var dataTable = new DataTable(tableName);

        // Fill the DataTable with the result of the SQL statement
        sqlDataAdapter.FillSchema(dataTable, SchemaType.Source);

        return dataTable;
    }

知道如何检索所有信息或如何获取FK(最好不使用纯SQL语法,因为我会缺少一些编译时检查)?

5 个答案:

答案 0 :(得分:5)

使用SMO你可以做到这一点......

using System;
using System.Collections.Generic;
using System.Text;
using System.Data.SqlClient;
using Microsoft.SqlServer.Management.Smo;
using Microsoft.SqlServer.Management.Smo.Agent;


// Add references: (in c:\Program Files\Microsoft SQL Server\90\SDK\Assemblies\)
// Microsoft SqlServer.ConnectionInfo
// Microsoft SqlServer.Management.Sdk.Sfc
// Microsoft SqlServer.Smo

namespace SMO
{
    class Program
    {
        static Database db;

        static void Main(string[] args)
        {
            Microsoft.SqlServer.Management.Smo.Server server;

            SqlConnection sqlConnection = new SqlConnection(@"Integrated Security=SSPI; Data Source=LOCAL");
            //build a "serverConnection" with the information of the "sqlConnection"
            Microsoft.SqlServer.Management.Common.ServerConnection serverConnection =
              new Microsoft.SqlServer.Management.Common.ServerConnection(sqlConnection);

            //The "serverConnection is used in the ctor of the Server.
            server = new Server(serverConnection);

            db = server.Databases["TestDB"];

            Table tbl;
            tbl = db.Tables["Sales"];
            foreach (ForeignKey fk in tbl.ForeignKeys)
            {
                Console.WriteLine("Foreign key {0} references table {1} and key {2}", fk.Name, fk.ReferencedTable, fk.ReferencedKey);
            } 
        }
    }
}

答案 1 :(得分:1)

您可以使用简单的ADO.NET查询检查数据库中的sys目录视图 - 如下所示:

  • sys.columns包含有关列的信息
  • sys.foreign_keys存储有关外键的信息
  • sys.tables表格

等。等等。只需做一个SELECT (list of fields) FROM sys.foreign_keys,看看你得到了什么!

有关详细信息,请参阅:联机丛书Querying the SQL Server System Catalog

答案 2 :(得分:0)

如果您正在寻找数据库架构的约束,那么ADO.net DataTable不是您的最佳选择。您可能会发现使用SMO更合适的选项。

答案 3 :(得分:0)

您可以使用SqlConnection获取信息。

string connectionString = "Data Source=.;Initial Catalog=Northwind;Integrated Security=True";
using (SqlConnection conn = new SqlConnection(connectionString))
{
    conn.Open();

    DataTable dtAllForeignKeys = conn.GetSchema("ForeignKeys");

    string[] restrictionValues = { "Northwind", "dbo", "Orders" };
    DataTable dtForeignKeysForJustTheOrderTable = conn.GetSchema("ForeignKeys", restrictionValues);
    conn.Close();
}

答案 4 :(得分:0)

DataTable对象与数据库表不同。由于您创建它们的方式,它们碰巧具有相同的结构。例如,您可以拥有一个DataTable,其中包含多个数据库表之间的连接结果。 DataTable可以拥有另一个DataTable的外键,但不能拥有数据库表。

要获取有关数据库中外键的信息,您需要读取表的元数据(当您调用SELECT时,您只获得查询的元数据,这就是您没有获得有关键的信息的原因。) 您可以直接从Information Schema Views查询此信息,也可以让SMO课程为您执行此操作。在后一种情况下,您从Server对象开始,然后获取数据库,表等。