Как определить столбец VB.NET DataTable в качестве первичного ключа после создания

Я импортирую таблицы из базы данных Oracle, используя адаптер данных VB.NET. Я использую команду «заполнить», чтобы добавить импортированные данные в набор данных. Как можно определить конкретный столбец DataTable как PrimaryKey после того, как DataTable уже заполнен данными?


person Olga    schedule 18.03.2010    source источник


Ответы (5)


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

    Dim table As New DataTable()

    table.Columns.Add(New DataColumn("MyColumn"))

    Dim primaryKey(1) As DataColumn
    primaryKey(1) = table.Columns("MyColumn")
    table.PrimaryKey = primaryKey

Чтобы иметь возможность использовать первичный ключ, вам необходимо убедиться, что все значения для данного столбца уникальны.

В основном я работаю на С# и использую несколько методов расширения, которые я использую, чтобы «привести в порядок» вызовы, которые мне нужно сделать, которые вы, возможно, захотите перевести на VB и использовать:

    public static void SetPrimaryKey(this DataTable value, string columnName)
    {
        value.PrimaryKey = new DataColumn[] { value.Columns[columnName] };
    }

    public static DataRow FindByPrimaryKey(this DataTable value, object key)
    {
        return value.Rows.Find(key);
    }

    // I can then do:

    DataTable table = CallToRoutineThatGetsMyDataTable();
    table.SetPrimaryKey("PKColumnName");
    DataRow result = table.FindByPrimaryKey("valueToFindWith");
person Rob    schedule 18.03.2010

Пока значения в столбце уникальны

table.PrimaryKey = new DataColumn[] { table.Columns["Id"] };

отрегулируйте имена столбцов.

person Kleinux    schedule 18.03.2010

Вот однострочный в VB (вопрос был с "использованием VB.NET"). В этом примере проиндексировано 2 столбца:

table.PrimaryKey = New DataColumn() {table.Columns("column1"), _
                                     table.Columns("column2")}

Обновление: А вот еще одна строчка о том, как использовать этот индекс с двумя столбцами для поиска строки:

table.Rows.Find(New Object() {value1, value2}) '<- DataRow returned

Обновление 2: И полный пример того, как найти строку с использованием первичных ключей с DataTable, уже заполненным данными:

'Define primary keys (you do this only once)
table.PrimaryKey = New DataColumn() {table.Columns("column1"), _
                                     table.Columns("column2")}
'Find a row:
Dim MyDataRow As DataRow
MyDataRow = table.Rows.Find(New Object() {value1, value2}) '<- DataRow returned
If MyDataRow IsNot Nothing Then 'If a row is found
    Return MyDataRow.Item("column3")
End If
person Matt Roy    schedule 10.06.2014

Спасибо за ответ, Роб - есть небольшая проблема с версией vb, поскольку индекс должен начинаться с нуля:

Dim table As New DataTable()

table.Columns.Add(New DataColumn("MyColumn"))

Dim primaryKey(1) As DataColumn
primaryKey(0) = table.Columns("MyColumn")
table.PrimaryKey = primaryKey
person CHale    schedule 20.10.2014

Это должен быть элегантный способ:

table.PrimaryKey = {table.Columns("PrimaryKeyColumn")}
person Ilya Kochetov    schedule 20.06.2020