Как получить первичный ключ таблицы в SQL Server 2008 - PullRequest
2 голосов
/ 20 декабря 2011

У меня есть следующий код, который должен быть в состоянии получить первичный ключ в таблице

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 в качестве моего параметра, читатель не возвращает результатов. Есть идеи, почему не удается вернуть мои первичные ключи?

Ответы [ 6 ]

1 голос
/ 20 декабря 2011

Похоже, у вас есть проблема с использованием .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 как тип, а не строку.

1 голос
/ 20 декабря 2011

Попробуйте вместо этого:

command.Parameters.Add("@table_name", SqlDbType.NVarChar).Value = tableName;
0 голосов
/ 20 декабря 2011

Вопрос: В вашей таблице определены ключи?

Я запустил слегка измененный код ниже для нескольких таблиц в собственной тестовой БД, и он работает, как и ожидалось:

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

}
0 голосов
/ 20 декабря 2011

Хранимая процедура 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, но может попробовать передать все три, чтобы увидеть, если она имеет значение.

0 голосов
/ 20 декабря 2011

Вы можете просто использовать, как показано ниже, попробуйте:

command.Parameters.AddWithValue("@table_name", ("dbo." + tableName));
0 голосов
/ 20 декабря 2011

Есть ли шанс, что он должен быть квалифицирован по схеме? Что-то вроде:

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

или

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

Или вам нужно добавить какой-нибудь параметр, чтобы указать базу данных внутри сервера?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...