【问题标题】:Retrieve DataTable info for a table in SQL Server检索 SQL Server 中表的 DataTable 信息
【发布时间】:2011-04-25 22:21:12
【问题描述】:

我需要获取列名、主键、外键和其他架构信息。 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 语法,因为这样我会缺少一些编译时检查)?

【问题讨论】:

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


    【解决方案1】:

    使用 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);
                } 
            }
        }
    }
    

    【讨论】:

    • 不错。该代码的任何版本使用SqlConnection?我希望外部参考不会有问题。
    • 这应该可以工作:new Server(new ServerConnection(sqlConnection))。
    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

      你可以使用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】:

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

      • sys.columns 提供有关您的专栏的信息
      • sys.foreign_keys 存储有关外键的信息
      • sys.tables 用于表格

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

      请参阅:在线图书Querying the SQL Server System Catalog 了解更多详情。

      【讨论】:

      • 坦率地说,使用起来很糟糕。不是 OO 并在我需要表名时返回表的 ID。
      • 太糟糕了——这有待讨论。但是有效率!!另外:只使用OBJECT_NAME(object_id) 并且你得到了你的表名......另外:SQL Server 是一个 RDBMS - 不是一个 OO 系统......
      • 感谢 OBJECT_NAME,它很有帮助。
      • 使用 INFORMATION_SCHEMA 视图而不是目录视图通常更方便。
      • 谢谢。我也希望接受您的回答,因为我使用了它。 SMO 遗憾地需要第三方部署。然而,SMO 更接近理想的解决方案。
      【解决方案5】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2012-10-11
        • 1970-01-01
        • 2020-04-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-03-14
        相关资源
        最近更新 更多