Posted at
gloopsDay 21

LINQPadで別DBサーバのテーブルを扱ったお話

More than 1 year has passed since last update.


gloops Advent Calendar 21日目:sunny:

gloops Advent Calendar2016も21日目に突入しました!

毎日エンジニアが頑張って投稿してくれているので無事に完走できそうです:thumbsup:

21日目は本日で誕生日を迎え40代に一歩近付いたy_nakaiが担当致します

普段はマネジメント業務をやっていてめっきりコードに触れることが減っているので小ネタになります

C#エンジニアなら一度は触れるであろう【LINQPad】についてです


背景

gloops Advent Calendar1日目にて紹介されたデータチェック方法について、

【LINQPad】を使用してデータ参照してメールで通知という方法も採用しております

今回は複数のDBサーバを跨って参照する際に行ったことを記します


LINQPadデフォルトだとスキーマ1個しか参照できない問題

LINQPadで参照できるスキーマってデフォルトだと1個だけで、

現在参照しているスキーマとは別スキーマからテーブルをD&Dするとスキーマ情報が変更されてしまいますよね

movie1.gif

そんな時、簡単に別スキーマ情報を追加することができるんです!

方法:左側のスキーマビューから、追加したいスキーマをCtrlを押しながらコード書いてるところにD&D

あら、簡単!

するとスキーマビューに新たな接続が追加されるので、参照したいテーブルをD&DすればOKです

movie2.gif

もちろん3つ以上スキーマを追加することが可能です!


だがしかし!これだと別サーバのDB参照できない問題

Ctrl押しながら追加できるなんて簡単やん

って試しに別サーバのテーブルをD&Dしたらエラーが発生しました

pic003.PNG

別サーバの場合は「linked servers」設定を入れなくてはいけないとのこと

リンクサーバーの作成方法はこちら

https://technet.microsoft.com/ja-jp/library/ff772782(v=sql.105).aspx

う~ん、インフラに相談が必要ですね・・・


Dapper使えば解決!

結局、自作しちゃったほうが早そうですね

Dapperを使ってみます

まずNuGet Package Manager(Ctrl+Shift+Pで起動)から「Dapper dot net」をAddして下さい

※注:Nuget integrationはDeveloper以上のライセンスが必要です

https://www.linqpad.net/Purchase.aspx

あとはDapperを使ったコードを書くだけです

簡単なサンプルを載せておきます


sample.cs


private const string ConnectionString = "xxx";

void Main()
{
GetDataById(5).Dump();
}

public IEnumerable<User> GetDataById(int id)
{
IEnumerable<User> resultList;

using (var conn = new SqlConnection(ConnectionString))
{
const string sql = @"SELECT [Id], [UserName], [GroupNo] FROM User WHERE [Id] = @Id";

conn.Open();
resultList = conn.Query<User>(sql, new { Id = id });
conn.Close();
}

return resultList;
}

public class User
{
public int Id { get; set; }
public string UserName { get; set; }
public int GroupNo { get; set; }
}


簡単にアクセスできました

同様に別DBについての記述をすればサーバを跨いだチェックが可能となります

こんな感じで、

gloops Advent Calendar1日目の投稿と同様に、必要なデータチェックをしてメール配信するようにしています