Link Search Menu Expand Document

Get Started for Db2


RepoDB is a hybrid .NET ORM library for IBM Db2 Database. The project is hosted at Github and is licensed with Apache 2.0.

Installation

Install the library via NuGet using the Package Manager Console.

> Install-Package RepoDb.Db2

Unlike the other providers, RepoDb.Db2 does not carry a transitive dependency on the underlying IBM ADO.NET driver. Because IBM ships a separate, platform-specific driver package for each operating system/architecture, Windows and other environment users must explicitly install the matching Net.IBM.Data.Db2* package on their own alongside RepoDb.Db2.

// Windows
> Install-Package RepoDb.Db2
> Install-Package Net.IBM.Data.Db2

// Linux
> Install-Package RepoDb.Db2
> Install-Package Net.IBM.Data.Db2-lnx

Pick the IBM driver package that matches your target platform.

PlatformIBM package
Windows x64Net.IBM.Data.Db2
Linux AMD64Net.IBM.Data.Db2-lnx
macOSNet.IBM.Data.Db2-osx
Linux IBM ZNet.IBM.Data.Db2-zlnx
Linux PowerNet.IBM.Data.Db2-ppc

After installation, call the globalized setup method to initialize all dependencies for Db2.

GlobalConfiguration
	.Setup()
	.UseDb2();

To use bulk operations (BulkDelete, BulkDeleteByKey, BulkInsert, BulkMerge and BulkUpdate), install the RepoDb.Db2.BulkOperations package.

> Install-Package RepoDb.Db2.BulkOperations

Create a Table

The examples below assume the following table exists in the database.

CREATE TABLE "PERSON"
(
    "ID" BIGINT GENERATED ALWAYS AS IDENTITY (START WITH 1, INCREMENT BY 1) PRIMARY KEY,
    "NAME" VARCHAR(128) NOT NULL,
    "AGE" INT NOT NULL,
    "CREATEDDATEUTC" TIMESTAMP NOT NULL
);

Create a Model

The examples below assume the following model exists in the application.

public class Person
{
    public long Id { get; set; }
    public string Name { get; set; }
    public int Age { get; set; }
    public DateTime CreatedDateUtc { get; set; }
}

Creating a Record

To insert a row, use the Insert method.

var person = new Person
{
    Name = "John Doe",
    Age = 54,
    CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new DB2Connection(ConnectionString))
{
    var id = connection.Insert(person);
}

To insert multiple rows, use the InsertAll operation.

var people = GetPeople(100);
using (var connection = new DB2Connection(ConnectionString))
{
    var rowsInserted = connection.InsertAll(people);
}

The Insert method returns the value of identity/primary column, while the InsertAll method returns the number of rows inserted. Both methods are automatically setting back the value of identity/primary property to the entity model (if present).

Querying a Record

To query a row, use the Query method.

using (var connection = new DB2Connection(ConnectionString))
{
    var person = connection.Query<Person>(e => e.Id == 1);
    /* Process the result here */
}

To query all rows, use the QueryAll method.

using (var connection = new DB2Connection(ConnectionString))
{
    var people = connection.QueryAll<Person>();
    /* Process the results here */
}

Merging a Record

To merge a row, use the Merge method.

var person = new Person
{
    Id = 1,
    Name = "John Doe",
    Age = 57,
    CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new DB2Connection(ConnectionString))
{
    var id = connection.Merge(person);
}

By default, the primary column is used as a qualifier. Custom qualifiers can also be specified.

var person = new Person
{
    Name = "John Doe",
    Age = 57,
    CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new DB2Connection(ConnectionString))
{
    var id = connection.Merge(person, qualifiers: (p => new { p.Name }));
}

To merge multiple rows, use the MergeAll method.

var people = GetPeople(100);
people
    .AsList()
    .ForEach(p => p.Name = $"{p.Name} (Merged)");
using (var connection = new DB2Connection(ConnectionString))
{
    var affectedRecords = connection.MergeAll<Person>(people);
}

The Merge method returns the identity/primary column value, while the MergeAll method returns the number of rows affected. Both methods are automatically setting back the value of identity/primary property if present.

Deleting a Record

To delete a row, use the Delete method.

using (var connection = new DB2Connection(ConnectionString))
{
    var deletedRows = connection.Delete<Person>(1);
}

Other columns can also be used as qualifiers.

using (var connection = new DB2Connection(ConnectionString))
{
    var deletedRows = connection.Delete<Person>(p => p.Name == "John Doe");
}

To delete all rows, use the DeleteAll method.

using (var connection = new DB2Connection(ConnectionString))
{
    var deletedRows = connection.DeleteAll<Person>();
}

A list of primary keys can also be passed for targeted deletion.

using (var connection = new DB2Connection(ConnectionString))
{
    var primaryKeys = new [] { 10045, 11001, ..., 12011 };
    var deletedRows = connection.DeleteAll<Person>(primaryKeys);
}

Both the Delete and DeleteAll methods return the number of rows affected during the execution.

Updating a Record

To update a row, use the Update method.

var person = new Person
{
    Id = 1,
    Name = "James Doe",
    Age = 55,
    CreatedDateUtc = DateTime.UtcNow
};
using (var connection = new DB2Connection(ConnectionString))
{
    var updatedRows = connection.Update<Person>(person);
}

Specific columns can also be targeted using a dynamic update.

using (var connection = new DB2Connection(ConnectionString))
{
    var updatedRows = connection.Update("Person", new { Id = 1, Name = "James Doe" });
}

To update multiple rows, use the UpdateAll method.

var people = GetPeople(100);
people
    .AsList()
    .ForEach(p => p.Name = $"{p.Name} (Updated)");
using (var connection = new DB2Connection(ConnectionString))
{
    var updatedRows = connection.UpdateAll<Person>(people);
}

By default, the primary column is used as a qualifier. Custom qualifiers can also be specified.

var people = GetPeople(100);
people
    .AsList()
    .ForEach(p => p.Name = $"{p.Name} (Updated)");
using (var connection = new DB2Connection(ConnectionString))
{
    var updatedRows = connection.UpdateAll<Person>(people,
        qualifiers: (p => new { p.Name }));
}

Both the Update and UpdateAll methods return the number of rows affected during the execution.

Executing a Query

To execute a non-query statement, use the ExecuteNonQuery method.

using (var connection = new DB2Connection(ConnectionString))
{
    var sql = "DELETE FROM \"PERSON\" WHERE \"ID\" = @Id";
    var affectedRecords = connection.ExecuteNonQuery(sql, new { Id = 1 });
}

To execute a query and return mapped objects, use the ExecuteQuery method.

using (var connection = new DB2Connection(ConnectionString))
{
    var sql = "SELECT * FROM \"PERSON\" ORDER BY \"ID\" ASC";
    var people = connection.ExecuteQuery<Person>(sql);
    /* Process the results here */
}

To execute a query and return a scalar value, use the ExecuteScalar method.

using (var connection = new DB2Connection(ConnectionString))
{
    var sql = "SELECT MAX(\"ID\") FROM \"PERSON\"";
    var maxId = connection.ExecuteScalar<long>(sql);
}

To execute a query and return a DbDataReader, use the ExecuteReader method.

using (var connection = new DB2Connection(ConnectionString))
{
    var sql = "SELECT * FROM \"PERSON\"";
    using (var reader = connection.ExecuteReader(sql))
    {
        /* Process the data reader here */
    }
}

Typed Result Execution

Single-column result sets can be mapped to any .NET CLR type via ExecuteQuery.

using (var connection = new DB2Connection(ConnectionString))
{
    var sql = "SELECT \"NAME\" FROM \"PERSON\" WHERE \"ID\" = @Id";
    var name = connection.ExecuteQuery<string>(sql, new { Id = 10045 });
}

The result of this operation is an IEnumerable object.