Я импортирую таблицы из базы данных Oracle, используя адаптер данных VB.NET. Я использую команду «заполнить», чтобы добавить импортированные данные в набор данных. Как можно определить конкретный столбец DataTable как PrimaryKey после того, как DataTable уже заполнен данными?
Как определить столбец VB.NET DataTable в качестве первичного ключа после создания
Ответы (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");
Пока значения в столбце уникальны
table.PrimaryKey = new DataColumn[] { table.Columns["Id"] };
отрегулируйте имена столбцов.
Вот однострочный в 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
Спасибо за ответ, Роб - есть небольшая проблема с версией 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
Это должен быть элегантный способ:
table.PrimaryKey = {table.Columns("PrimaryKeyColumn")}