【问题标题】:How to get DefaultValue of column from database schema in C#?如何从 C# 中的数据库模式中获取列的 DefaultValue?
【发布时间】:2016-10-14 19:16:50
【问题描述】:

我正在尝试从 C#(.NET 4.5、SQL Server 2014)中的数据库架构中读取信息。在我提到将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'
)

现在如果我说,INSERT INTO Person (Id, LastName, FirstName) VALUES (1, 'Doe', 'John') HomeState 将是“NY”,即使我没有设置它。

【问题讨论】:

  • 只是确认您是否尝试获取数据库表中设置的列的默认值?像位数据类型它是 (0) ?
  • @Searching 创建或更改表时,您可以为列设置默认值。例如,如果在 INSERT 语句中未指定任何值,我可以说如果创建了新行,则始终将日期时间字段设置为“1900-01-01”。用示例更新问题。
  • 正是我想知道的,您似乎已经找到了答案。

标签: c# database-schema datacolumn


【解决方案1】:

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

【讨论】:

  • 那行得通。它甚至可以获取动态值,例如“GETDATE()”或“NEWID()”。这是一种使用数据库的奇怪方式。如果给定一个连接字符串,我已经要求连接到特定的数据库(而不是服务器),那么为什么需要从 serverConnection 移动到服务器再到数据库?
  • 如果你有权利,你可以做Server svr = new Server("your_server_name");
  • 我不知道您可以从数据库名称 @Crowcoder 创建服务器实例 - 谢谢。据推测,这必须是完全合格的,即[服务器].[数据库]
  • 不,是错字,我修正了。服务器名称,而不是数据库名称。
  • 感谢您的澄清,如果可行,我将测试并更新我的答案
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-04-12
  • 2011-04-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多