我正在尝试在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或其他方式完成吗?
非常感谢!
福
答案 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;