プログラム

SQLServerにC#でアクセスする(Dapper版)

以前、SQLCommand版を紹介しましたが、今回はDapperというライブラリを使用したものになります。使い方は以前紹介したものとあまり変わりませんが、データの扱い方が変わります
また、connectionStringは以下で作成したものと同じものを使用しています

前回の記事
SQLServerにC#でアクセスする(SqlCommand版) - ナストンのまとめ
SQLServerにC#でアクセスする(SqlCommand版) - ナストンのまとめ

これまでSQLサーバーにC#でアクセスしたことがなく、そのやり方を勉強した際に使用したものです。今回はSQLComman ...

続きを読む

Dapperをインストールする

DapperをNugetからインストールします

「Dapper」と検索して、画像のようなロゴになっているものをDLする

受け皿のクラスを作成する

SQLからデータ受け渡し用のクラスを作成します

// クラスのコンストラクタに引数を設定
public class BooksTableEntity
{
    public BooksTableEntity(int bookId, string bookName, int bookISBN)
    {
        BookId = bookId;
        BookName = bookName;
        BookISBN = bookISBN;
    }

    public int BookId { get; set; }

    public string BookName { get; set; }

    public int BookISBN { get; set; }
}

Dapperの注意点

Dapperを使用する上で注意する点があり、それはクラスのインスタンスに受け取るテーブルと同じ名前でないとエラーとなります

例:
SQL上のテーブルが以下の場合

列名列の型
TestIdint
ColumnNamevarchar(250)
// 上記のテーブル用の受け皿となるクラス(OK)
public class TestTableEntity
{
    public TestTableEntity(int testId, string columnName)
    {
        TestId = testId;
        ColumnName = columnName;
    }

    public int TestId { get; set; }

    public string ColumnName { get; set; }
}

// 上記のテーブル用の受け皿となるクラス(NG)
// 引数に_(アンダーバー)がついている
public class TestTableEntity
{
    public TestTableEntity(int _testId, string _columnName)
    {
        TestId = _testId;
        ColumnName = _columnName;
    }

    public int TestId { get; set; }

    public string ColumnName { get; set; }
}

この罠に気付くのにそこそこ時間を要しました

Sqlに情報を追加する

データベースにデータを登録します
SQLCommandと違う点はcommand.Parameters.AddWithValueでないことだけであまり変わらない印象です

public void Insert_Dapper(BooksTableEntity _booksTableEntity)
{
    string sql = @"
insert into BooksTable
(BookId,
BookName,
BookISBN)
values
(
 @BookId,
 @BookName,
 @BookISBN
)
";

    using (var connection = new SqlConnection(connectionString))
    {
        connection.Execute(sql,
            new
            {
                BookId = _booksTableEntity.BookId,
                BookName = _booksTableEntity.BookName,
                BookISBN = _booksTableEntity.BookISBN
            });
    }
}

Sqlの情報を取得する

データベースに登録されているデータを取得します
SQLCommandと比べるとかなりすっきりとした書き方となります

public void Read_Dapper()
{
    var sql = @"
select BookId,
       BookName,
       BookISBN
from BooksTable
";

    using (var connection = new SqlConnection(SqlServerHelper.connectionString))
    {
        // Dapperクラスを使用
        // クラスのコンストラクタとSQLの列名が同じである必要がる
        // 同じでないとエラーとなるの注意
        var result = connection.Query<BooksTableEntity>(sql).ToList();
        foreach(var item in result)
        {
            Console.WriteLine(string.Format("BookId:{0} BookName:{1}, BookISBN:{2}", item.BookId, item.BookName, item.BookISBN));
        }
    }
}

Sqlの情報を更新する

データベースに登録されているデータを更新します
更新対象のデータが存在しない場合は、データを作成しています。こちらもSQLCommandと比較してデータ作成時と同様であまり変わりません

public void Update_Dapper(BooksTableEntity _booksTableEntity)
{
    string sql = @"
update BooksTable
set BookName = @BookName,
    BookISBN = @BookISBN
where BookId = @BookId
";

    using (var connection = new SqlConnection(SqlServerHelper.connectionString))
    {
        var updateCount = connection.Execute(sql,
            new
            {
                BookId = _booksTableEntity.BookId,
                BookName = _booksTableEntity.BookName,
                BookISBN = _booksTableEntity.BookISBN
            });
        if (updateCount < 1)
        {
            Insert_Dapper(_booksTableEntity);
        }
    }
}

Sqlの情報を削除する

データベースに登録されているデータを削除します
こちらもSQLCommandと比較してデータ作成時と同様であまり変わりません

public void Delete_Dapper(int _bookId)
{
    string sql = @"
delete BooksTable
where BookId = @BookId
";

    using (var connection = new SqlConnection(SqlServerHelper.connectionString))
    {
        connection.Execute(sql,
            new
            {
                BookId = _bookId
            });
    }
}

-プログラム
-, ,