How to define a VB.NET DataTable Column as primary key after creation

此生再无相见时 提交于 2019-12-03 07:24:41

You can set the primary key of a table by:

    Dim table As New DataTable()

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

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

To be able to use the primary key, you need to ensure that all values for the given column are unique.

I primarily work in C# and have a couple of Extension methods I use to "tidy" the calls I need to make, which you might want to consider translating to VB and using:

    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");

As long as the values in the column are unique

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

adjust for your column names.

Here is a one-liner in VB (the question was with "using VB.NET"). This example is with 2 columns indexed:

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

Update: And here's another one-liner on how to use this 2 columns index to find a row:

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

Thanks for the answer Rob - there is a slight issue with the vb version though as the index should be zero-based:

Dim table As New DataTable()

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

Dim primaryKey(1) As DataColumn
primaryKey(0) = table.Columns("MyColumn")
table.PrimaryKey = primaryKey
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!