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