Получение таблиц MySql PrimaryKey в C # с использованием OdbcConntion (System.Data.Odbc) - PullRequest
1 голос
/ 09 марта 2012

Я пытаюсь получить первичный ключ таблицы в базе данных MySQL с помощью C-Sharp (C #) и сталкиваюсь с проблемой.

Я посмотрел на различные предлагаемые коллекции метаданных и соответствующие столбцы, однако ни один из них не предлагает первичный ключ. Коллекции «Таблицы» и «Индексы» кажутся наиболее перспективными. ИНТЕРЕСНО, OdbcConnection.GetSchema () имеет свойство / метод PrimaryKey, однако не существует случая, когда свойство PrimaryKey дает что-то отличное от нуля.

Индексы и таблицы действительно казались очевидным выбором. Да, таблицы в базе данных имеют первичный ключ, и база данных работает.

Вот некоторый код, хотя для этого вопроса ни один не кажется действительно необходимым. Я выбрал «Таблицы» для целей этого примера, но можно просто изменить на «Индексы» (или что-нибудь еще). Очевидно, COLUMN_NAME существует для таблиц. У меня просто есть это для чего угодно, играя.

public String GetPrimaryKey(String strTable)
{  
try  
{  
    String strPrimaryKey = null;  
    String[] strRestricted = new String[4] { null, null, strTable, null };  
    DataTable oSchema = null;  


    // Make sure that there is a connection.
    if (ConnectionState.Open != this.m_oConnection.State)
        this.m_oConnection.Open();

    // DATABASE: Get the schema
    oSchema = this.m_oConnection.GetSchema("Tables", strRestricted);

    // Extract the information related to the primary column, in the format "{System.Data.DataColumn[0]}"
    DataColumn[] oPrimaryKeys = oSchema.PrimaryKey;

    // Extract: Column Names
    foreach (DataRow oRow in oSchema.Rows)
    {
        // Get the column name.
        String strColumnName = oRow["COLUMN_NAME"].ToString();
    }

    return strPrimaryKey;
}

catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}

return null;
}

Проводя исследование, мне показалось интересным, что я не смог найти ни одного сообщения от кого-либо, использующего свойство GetSchema (). PrimaryKey.

Так как мне определить первичный ключ?

Заранее спасибо.

1 Ответ

3 голосов
/ 10 марта 2012

Ваш комментарий был волшебным ключом.Я не знал, что старый интерфейс устарел.Найти правильный код было непросто, так как, к сожалению, в коллекции Indexes нет «COLUMN_NAME», а в коллекциях Columns «PRIMRY», поэтому мне придется пройти через два раза, но новая версия намного лучше.

public String GetPrimaryKey(String strTable)
{
    try
    {
        Boolean bIsPrimary = false;
        String strIndexName = null;
        String strColumnName = null;
        String[] strRestricted = new String[4] { null, null, strTable, null      };
        DataTable oSchemaIndexes = null;
        DataTable oSchemaIndexColumns = null;


        // Make sure that there is a connection.
        if (ConnectionState.Open != this.m_oConnection.State)
            this.m_oConnection.Open();

        // DATABASE: Get the schemas needed.
        oSchemaIndexes = this.m_oConnection.GetSchema("Indexes", strRestricted);
        oSchemaIndexColumns = this.m_oConnection.GetSchema("IndexColumns", strRestricted);

        // Get the index name for the primary key.
        foreach (DataRow oRow in oSchemaIndexes.Rows)
        {
            // If we have a primary key, then we found what we want.
            strIndexName = oRow["INDEX_NAME"].ToString();
            bIsPrimary = (Boolean)oRow["PRIMARY"];
            if (true == bIsPrimary)
                break;
        }

        // If no primary index, bail.
        if (false == bIsPrimary)
            return null;

        // Get the corresponding column name.
        foreach (DataRow oRow in oSchemaIndexColumns.Rows)
        {
            // Get the column name.
            if (strIndexName == (String)oRow["INDEX_NAME"])
            {
                strColumnName = (String)oRow["COLUMN_NAME"];
                break;
            }
        }

        return strColumnName;
    }

    catch (Exception ex)
    {
        MessageBox.Show(ex.Message);
    }

    return null;
}
...