代码之家  ›  专栏  ›  技术社区  ›  Luc

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

  •  1
  • Luc  · 技术社区  · 15 年前

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

    我在visualbasic2008express中工作,创建了一个SQL数据库MyDatabase和一个名为MyTable的表。在那个表中,我有3列,“ID”、“Column1”和“Column2”。我知道,我知道。。。别出心裁的名字。在Database Explorer的column properties下,我将“ID”列“Identity Specification”设置为“yes”,并将“Is Identity”值设置为“yes”。

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

    非常感谢提前!

    运气

    3 回复  |  直到 15 年前
        1
  •  3
  •   shahkalpesh    15 年前

    使用SQLDataReader打开MyTable(从MyTable中选择ID,其中1=2)&使用GetSchemaTable方法,它将为您提供datatable。

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

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

    注意:这完全基于我的内存和MSDN文档中的帮助。

        2
  •  2
  •   Christian C. Salvadó    15 年前

    如果有Linq to SQL数据上下文,则可以通过查询数据上下文来获取表元数据 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 财产。

    通过一点反射,您可以对任何表/数据上下文重新利用此代码。

        3
  •  0
  •   Jonathan    15 年前

    您可以调用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;