【问题标题】:How to get the primary key of a table in sql server 2008sql server 2008如何获取表的主键
【发布时间】:2011-12-20 16:34:58
【问题描述】:

我有以下代码,应该能够获取表中的主键

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 作为参数传入时,阅读器不会返回任何结果。知道为什么这可能无法返回我的主键吗?

【问题讨论】:

  • 您确定要对包含Users 表的数据库(而不是master 数据库,例如)执行命令吗?
  • 您是否尝试过查询分析器中的“exec sp_pkeys Users”?
  • 嗨,你在这行得到了正确的值吗:retVal.Add(reader[3].ToString());?您还可以指定列名而不是其编号。这样,您可以执行以下操作: retVal.Add(reader["key"].ToString());并且更容易判断您是否正在尝试获取正确的列值。
  • 有意思,我刚试过,好像不行?我只是假设存储过程会起作用。我也用合格的模式尝试过......仍然没有运气。不过这张表肯定存在。
  • @marc_s - 这不是 OP 自己的程序。这是一个系统。

标签: c# sql sql-server database sql-server-2008


【解决方案1】:

试试这个:

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

【讨论】:

  • 还是没有运气。当我在 Sql Management Studio 中执行存储过程并且它没有返回任何结果时,这一事实与我有关。
【解决方案2】:

您对.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 添加为类型而不是字符串。

【讨论】:

    【解决方案3】:

    是否有可能需要使用架构进行限定?比如:

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

    或:

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

    或者是否需要添加一些参数来告诉它服务器内部的数据库?

    【讨论】:

    • 感谢您的回复。我试着试一试。仍然没有运气。我接受了其中一个 cmets 的建议,并尝试了查询分析器中的存储过程......它也没有返回任何内容。然后我尝试了您使用合格架构的建议,仍然不行......
    【解决方案4】:

    你可以像下面这样简单地使用,请你试试看:

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

    【讨论】:

      【解决方案5】:

      存储过程“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,但可以尝试通过所有三个来查看它是否有所作为。

      【讨论】:

        【解决方案6】:

        问题:您的表是否定义了任何键?

        我已经针对我自己的测试数据库中的多个表运行了下面稍作修改的代码,它按预期工作:

        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;
            }
        
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2013-04-11
          • 1970-01-01
          • 2011-04-24
          • 1970-01-01
          相关资源
          最近更新 更多