如何获得一个表的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
作为我的参数时,阅读器不返回任何结果。任何想法为什么这可能无法返回我的主键?
它需要用模式来限定吗?喜欢的东西:
command.Parameters.AddWithValue("@table_name", typeof(SqlChars)).Value = "dbo." + tableName;
或:
command.Parameters.AddWithValue("@schema", "dbo");
或者是有一些的parm你需要添加到告诉它在服务器内部的数据库?
感谢您的回复。我试图给这个镜头。仍然没有运气。我从其中一个注释中提取了建议,并从查询分析器中尝试了存储过程......它也没有返回任何结果。然后,我尝试使用合格的架构的建议,仍然没有去... – user489041 2011-12-20 16:46:17
试试这个:
command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName;
仍然没有运气。事实上,当我在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;
}
}
你确定你是对其中包含的数据库中执行该命令的'用户表(而不是'master'数据库,例如)? – RoccoC5 2011-12-20 16:38:32
您是否试过来自查询分析器的“exec sp_pkeys Users”? – Aaron 2011-12-20 16:41:01
嗨,你是否在这一行中获得正确的值:retVal.Add(reader [3] .ToString());?您还可以指定列名称而不是数字。这样你可以做一些事情:retVal.Add(reader [“key”]。ToString());并且如果您试图获得正确的列值,会更容易判断。 – Felipe 2011-12-20 16:43:23