如何在sql server 2008中获取表的主键

本文关键字:获取 2008 sql server | 更新日期: 2023-09-27 18:18:20

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

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

如何在sql server 2008中获取表的主键

试试这个:

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

看起来您使用.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", typeof(SqlChars)).Value = "dbo." + tableName;

或:

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

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

您可以简单地使用下面的代码,请您尝试一下:

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,但可以尝试传递所有三个,看看它是否有区别。

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

我在我自己的测试DB中对几个表运行了下面稍微修改的代码,它按预期工作:

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