在.NET中确定SQL Server标识列名称

时间:2009-07-22 05:14:03

标签: .net sql-server vb.net linq linq-to-sql

我正在尝试在VB.NET中编写一些通用代码,用于确定SQL Server数据库表是否包含标识列,如果是,则返回该列的名称。

我正在使用Visual Basic 2008 Express并创建了一个SQL数据库“MyDatabase”,其中包含一个名为“MyTable”的表。在该表中,我有3列,“ID”,“Column1”和“Column2”。我知道,我知道......有创造性的名字。在Database Explorer中的列属性下,我将“ID”列“Identity Specification”设置为“yes”,并将“Is Identity”值设置为“yes”。

我需要.NET代码返回“ID”作为标识列。这可以通过LINQ或其他方式完成吗?

非常感谢!

3 个答案:

答案 0 :(得分:3)

使用SQLDataReader打开MyTable(来自myTable WHERE 1 = 2的SELECT ID)&使用GetSchemaTable方法,它将为您提供数据表。

根据文档,检查名为IsAutoIncrement的列的内容。如果返回true,则应为Identity列。

http://msdn.microsoft.com/en-us/library/system.data.sqlclient.sqldatareader.getschematable.aspx

注意:这完全基于我的记忆和来自MSDN文档的帮助。

答案 1 :(得分:2)

如果您有Linq to SQL DataContext,则可以通过查询数据上下文MappingSource来获取表元数据:

var ctx = new YourDataContext();
var identityAndKey = ctx.Mapping.MappingSource
                                .GetModel(typeof(YourDataContext)) 
                                .GetMetaType(typeof(YourTable))
                                .DataMembers
                                .SingleOrDefault(i => i.IsDbGenerated &&
                                                      i.IsPrimaryKey);

您将获得一个MetaDataMember实例,它是数据类的主键和DbGenerated(Identity)属性。列名称可在Name属性中找到。

通过一些反思,您可以将此代码重新用于任何表/数据上下文。

答案 2 :(得分:0)

您可以调用sp_columns存储过程来获取此信息以及更多信息:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB);
sqlConx.Open();
SqlCommand cmd = new SqlCommand("sp_columns", sqlConx);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@table_name", TableName));
DataTable tblColumns = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(tblColumns);

编辑:您还可以获取有关主键的信息,如下所示:

SqlConnection sqlConx = new SqlConnection(p_conectionStrWithDB);
sqlConx.Open();
SqlCommand cmd = new SqlCommand("sp_pkeys", sqlConx);
cmd.CommandType = CommandType.StoredProcedure;
cmd.Parameters.Add(new SqlParameter("@table_name", tableName));
DataTable tblConstraints = new DataTable();
SqlDataAdapter da = new SqlDataAdapter(cmd);
da.Fill(tblConstraints);
return tblConstraints;