如何从C#中的数据库模式中获取列的DefaultValue?
我正在尝试从C#(SQL Server 2014.NET4.5)中的数据库模式中读取信息。在我提到将如何从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
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创建服务器实例-谢谢。大概这必须是完全限定的,即[服务器]。[数据库]不,是打字错误,我已经修复了。服务器名称,而不是数据库名称。感谢您的澄清,如果答案有效,我将测试并更新我的答案