Получить данные DataTable для таблицы в SQL Server - PullRequest
2 голосов
/ 15 октября 2010

Мне нужно получить имена столбцов, первичные ключи, внешние ключи и другую информацию о схеме. Класс 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 ]

5 голосов
/ 15 октября 2010

Используя 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 голос
/ 15 октября 2010

Вы всегда можете проверить представления каталога sys в своей базе данных, используя простой запрос ADO.NET - представления типа:

  • sys.columns с информацией о ваших столбцах
  • sys.foreign_keys, в котором хранится информация о внешних ключах
  • sys.tables для таблиц

и т. Д.и так далее.Просто сделайте SELECT (list of fields) FROM sys.foreign_keys и посмотрите, что у вас получится!

См. Электронные книги Запрос системного каталога SQL Server для получения более подробной информации.

0 голосов
/ 15 октября 2010

Объект DataTable отличается от таблицы базы данных.Они просто имеют одинаковую структуру из-за того, как вы их создаете.Например, у вас может быть DataTable, который содержит результат объединения нескольких таблиц базы данных.DataTable может иметь внешний ключ для другого DataTable, но не для таблицы базы данных.

Чтобы получить информацию о внешних ключах в базе данных, вам нужно прочитать метаданные для таблиц (когда вы вызываете SELECT,получать только метаданные для запроса, поэтому у вас нет информации о ключах).
Вы можете запросить эту информацию напрямую из Представления информационной схемы или сделать это за вас для классов SMO.В последнем случае вы начинаете с объекта Server , затем получаете базу данных, таблицы и т. Д.

0 голосов
/ 15 октября 2010

Вы можете использовать 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();
}
0 голосов
/ 15 октября 2010

Если вы ищете ограничения схемы вашей базы данных, то таблица данных ADO.net - не лучший вариант. Вы можете использовать более подходящую опцию SMO .

...