如何从C#中的数据库模式中获取列的DefaultValue?

如何从C#中的数据库模式中获取列的DefaultValue?,c#,database-schema,datacolumn,C#,Database Schema,Datacolumn,我正在尝试从C#(SQL Server 2014.NET4.5)中的数据库模式中读取信息。在我提到将DataAdapter.MissingSchemaAction设置为MissingSchemaAction.AddWithKey之前,我在MaxLength/ColumnLength等一些字段上遇到了问题。不幸的是,即使对于SQL Server中列属性的“默认值或绑定”中设置了默认值的列,DefaultValue字段仍然为空 SqlDataAdapter dbadapter = new SqlDa

我正在尝试从C#(SQL Server 2014.NET4.5)中的数据库模式中读取信息。在我提到将
DataAdapter.MissingSchemaAction
设置为
MissingSchemaAction.AddWithKey之前,我在MaxLength/ColumnLength等一些字段上遇到了问题。不幸的是,即使对于SQL Server中列属性的“默认值或绑定”中设置了默认值的列,DefaultValue字段仍然为空

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从表中的列中读取默认值(最好不用查询SQL的
sys.*
表)

澄清

创建或更改表时,如果未提供默认值,则可以设置列的默认值。我正在尝试获取默认值

例如:

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

现在,如果我说,
插入Person(Id,LastName,FirstName)值(1,'Doe','John')
即使我没有设置,家庭状态也将是'NY'。

尝试使用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();
}
编辑

感谢@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)?@在创建或更改表时进行搜索,可以为列设置默认值。例如,我可以说,如果创建了新行,如果INSERT语句中没有指定值,则始终将datetime字段设置为“1900-01-01”。用例子更新了问题。这正是我想知道的,看起来你们已经找到了答案。这很有效。它甚至可以获取动态值,如“GETDATE()”或“NEWID()”。这是一种与DB合作的奇怪方式。如果给定一个连接字符串,我已经要求连接到一个特定的数据库(不是服务器),那么为什么需要从服务器连接到服务器再到数据库呢?如果你有权限,你可以只做
server svr=new server(“你的服务器名称”)我不知道您可以从数据库名@Crowcoder创建服务器实例-谢谢。大概这必须是完全限定的,即[服务器]。[数据库]不,是打字错误,我已经修复了。服务器名称,而不是数据库名称。感谢您的澄清,如果答案有效,我将测试并更新我的答案