如何获得一个表的SQL Server中的主键2008

问题描述:

我有下面的代码应该能够获得主键的表如何获得一个表的SQL Server中的主键2008

public List<string> GetPrimaryKeysForTable(string tableName) 
    { 
     List<String> retVal = new List<string>(); 
     SqlCommand command = connector.GetCommand("sp_pkeys"); 
     command.CommandType = System.Data.CommandType.StoredProcedure; 
     command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = tableName; 
     SqlDataReader reader = command.ExecuteReader(); 
     while (reader.Read()) 
     { 
      retVal.Add(reader[3].ToString()); 
     } 
     return retVal; 
    } 

我有一个表在我的数据库称为Users。当我通过Users作为我的参数时,阅读器不返回任何结果。任何想法为什么这可能无法返回我的主键?

+1

你确定你是对其中包含的数据库中执行该命令的'用户表(而不是'master'数据库,例如)? – RoccoC5 2011-12-20 16:38:32

+1

您是否试过来自查询分析器的“exec sp_pkeys Users”? – Aaron 2011-12-20 16:41:01

+0

嗨,你是否在这一行中获得正确的值:retVal.Add(reader [3] .ToString());?您还可以指定列名称而不是数字。这样你可以做一些事情:retVal.Add(reader [“key”]。ToString());并且如果您试图获得正确的列值,会更容易判断。 – Felipe 2011-12-20 16:43:23

它需要用模式来限定吗?喜欢的东西:

command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = "dbo." + tableName; 

或:

command.Parameters.AddWithValue("@schema", "dbo"); 

或者是有一些的parm你需要添加到告诉它在服务器内部的数据库?

+1

感谢您的回复。我试图给这个镜头。仍然没有运气。我从其中一个注释中提取了建议,并从查询分析器中尝试了存储过程......它也没有返回任何结果。然后,我尝试使用合格的架构的建议,仍然没有去... – user489041 2011-12-20 16:46:17

试试这个:

command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName; 
+0

仍然没有运气。事实上,当我在Sql Management Studio中执行存储过程并且它没有返回结果时,我就会担心。 – user489041 2011-12-20 16:55:24

它看起来就像你有一个问题,你的.AddWithValue()使用这可能会导致您的问题。请参阅下面的修复:

public List<string> GetPrimaryKeysForTable(string tableName) 
{ 
    List<string> retVal = new List<string>(); 
    SqlCommand command = connector.GetCommand("sp_pkeys"); 
    command.CommandType = System.Data.CommandType.StoredProcedure; 
    command.Parameters.AddWithValue("@table_name", tableName); 
    SqlDataReader reader = command.ExecuteReader(); 
    while (reader.Read()) 
    { 
     retVal.Add(reader[3].ToString()); 
    } 
    return retVal; 
} 

在你的榜样,你试图将@table_name添加为一个类型,而不是一个字符串。

您可以简单地使用如下,请你尝试一下:

command.Parameters.AddWithValue("@table_name", ("dbo." + tableName)); 

存储过程“sp_pkeys”有三个参数:

command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName; 
command.Parameters.Add("@table_owner", SqlDbType.NVarChar).Value = tableOwner; 
command.Parameters.Add("@table_qualifier", SqlDbType.NVarChar).Value = tableQualifier; 

它适用于只是@table_name却苦于尝试通过所有三个,看看它是否有所作为。

问题:你的表有没有定义任何键?

我在我自己的测试数据库运行略微修改后的代码下面对Severa的表,它按预期工作:

static class Program 
{ 
    static void Main(string[] args) 
    { 
     var connStr = new SqlConnectionStringBuilder 
     { 
      DataSource = "localhost", 
      InitialCatalog = "RichTest", 
      IntegratedSecurity = true 
     }; 

     using (var conn = new SqlConnection(connStr.ToString())) 
     { 
      conn.Open(); 

      var parents = GetPrimaryKeysForTable(conn, "People"); 

      Console.WriteLine("Parent Keys:"); 
      foreach (var p in parents) 
      { 
       Console.WriteLine(" {0}", p); 
      } 
     } 
    } 

    static IList<string> GetPrimaryKeysForTable(SqlConnection conn, string tableName) 
    { 
     if (conn == null) throw new ArgumentNullException("Value is null", "conn"); 
     if (string.IsNullOrWhiteSpace(tableName)) throw new ArgumentNullException("Value is null or emtpy", "tableName"); 

     List<String> retVal = new List<string>(); 
     using (var command = new SqlCommand 
     { 
      Connection = conn, 
      CommandText = "sp_pkeys", 
      CommandType = CommandType.StoredProcedure 
     }) 
     { 
      command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = tableName; 
      SqlDataReader reader = command.ExecuteReader(); 
      while (reader.Read()) 
      { 
       retVal.Add(reader["COLUMN_NAME"].ToString()); 
      } 
     } 
     return retVal; 
    } 

}