2016-10-14 13 views
1

Я пытаюсь прочитать информацию из моей схемы базы данных в C# (.NET 4.5, SQL Server 2014). У меня возникли проблемы с некоторыми полями, такими как MaxLength/ColumnLength, до тех пор, пока не будет found a forum, который упоминает установку DataAdapter.MissingSchemaAction на MissingSchemaAction.AddWithKey. К сожалению, поле DefaultValue по-прежнему пуст даже для столбцов, для которых по умолчанию задано значение «Значение по умолчанию или привязка» в свойствах столбца в SQL Server.Как получить DefaultValue столбца из схемы базы данных в C#?

SqlDataAdapter dbadapter = new SqlDataAdapter(SELECT_STRING, CONN_STRING); 
dbadapter.MissingSchemaAction = MissingSchemaAction.AddWithKey; 
DataTable tbl = new DataTable(); 
dbadapter.Fill(tbl); 

// I actually looped through all rows/columns, but the net effect here is... 
tbl.Columns[0].DefaultValue; // blank for all columns 

// Also tried accessing the schema table available through DataReader 
IDataReader reader = tbl.CreateDataReader(); 
DataTable schemaTbl = reader.GetSchemaTable(); 
/* 
* There are different schema fields here than in DataColumn, 
* but DefaultValue still blank. I looped through them all but... 
*/ 
schemaTbl.Rows[0]["DefaultValue"]; // blank for all columns 

Как я могу прочитать значение по умолчанию из столбца в моей таблице с использованием .NET (желательно, не прибегая к запрашивая sys.* таблиц SQL для).

Разъяснение

При создании или изменении таблицы, вы можете установить значение по умолчанию для столбца, если он не предусмотрен. Я пытаюсь получить значение по умолчанию.

Пример:

CREATE TABLE Person 
(
    Id int NOT NULL, 
    LastName varchar(255) NOT NULL, 
    FirstName varchar(255) NOT NULL, 
    HomeState varchar(2) DEFAULT 'NY' 
) 

Теперь, если я скажу, INSERT INTO Person (Id, LastName, FirstName) VALUES (1, 'Doe', 'John') HomeState будет «Нью-Йорк», хотя я не ставил его.

+0

Просто подтверждения, которую вы пытаясь получить значение по умолчанию для столбца, установленного в таблице базы данных? например, для некоторого типа данных (0)? – Searching

+0

@ Поиск. При создании или изменении таблицы вы можете установить значение по умолчанию для столбца. Например, я могу сказать, создана ли новая строка, чтобы всегда устанавливать поле datetime в значение «1900-01-01», если в инструкции INSERT не указано значение. Обновленный вопрос с примером. – Rick

+0

Точно то, что я хотел знать, и кажется, что вы нашли свой ответ. – Searching

ответ

2

Попробуйте использовать библиотеку Microsoft.SqlServer.Smo, как показано ниже:

using (var connection = new SqlConnection("connectionString")) 
{ 
    var serverConnection = new ServerConnection(connection); 
    var server = new Server(serverConnection); 
    var database = server.Databases["databaseName"]; 
    var table = database.Tables["tableName"]; 

    foreach (Column column in table.Columns) 
    { 
     Console.WriteLine($"{column.Name} - default constraint: {column.DefaultConstraint?.Text ?? "None"}"); 
    } 
    Console.ReadLine(); 
} 

EDIT

Благодаря @Crowcoder, который предложил ниже упрощение:

var serverConnection = new ServerConnection("serverName", "username", "password"); 
var server = new Server(serverConnection); 
var database = server.Databases["databaseName"]; 
var table = database.Tables["tableName"]; 

foreach (Column column in table.Columns) 
{ 
    Console.WriteLine($"{column.Name} - default constraint: {column.DefaultConstraint?.Text ?? "None"}"); 
} 
Console.ReadLine(); 
+0

Это работает. Он даже получает динамические значения, такие как «GETDATE()» или «NEWID()». Это странный способ работы с БД. Если задана строка подключения, я уже прошу подключиться к конкретному БД (а не к серверу), поэтому почему нужно переходить с сервера на соединение с сервером? – Rick

+2

Если у вас есть права, вы можете просто «Server svr = new Server (« your_server_name »);' – Crowcoder

+1

Я не знал, что вы можете создать экземпляр сервера из имени базы данных @Crowcoder - спасибо. Предположительно, это должно быть полностью квалифицированным, I.e. [сервер]. [база данных] – JamieS