I'm KUITARIDER.

がりゅうさんのサイキックミラクルブログ

Microsoft SQL Server の導入

Microsoft SQL Server

ってすごいですね

かねのbot再編計画の一環です

 

かねのbotはいくつかのデータを予め用意する必要があって、起動時に毎回それを読み込む仕組みになっています。

かねの本人のツイートリストなどがその例です。

「いくつか」と書きましたが今までの実装ではツイートリスト(約50000万件)とそれを抽出するための下ネタリスト(約20件)、後はちんガ関連のユーザーデータ(約400件)しかないのでまあtxtファイル or csvファイル+エクセルでなんとかなってました。

ですが、あまりにも愚直すぎて恥ずかしいというのと、配列として単純に読み書きしようとするとカラム名でindexを指定できなくてコードが汚くなってしまっていたのでもう少し洗練された方法を使わなければいけないと感じてはいました。

全く知識はなかったのですが、なんとなくこういうときには「データベース」とやらを使うのかなとアタリをつけて適当にググッた結果、データはSQL Serverで管理するとよさそうだという結論に。

なんで今までテキストファイルで頑張ってたのか分からないほど現状にピッタリの選択肢です。

今回は、このSQL Serverの導入についてまとめます。C#でデータベースに初挑戦する人の参考になれば幸いです。

 

データベースの概念的な

(ぼく自身がデータベース初挑戦なので)

"データベース"でググるとそれが何たるかはなんとなく理解できると思うのでデータベース初心者(自分含む)はひたすらググってお勉強しましょう。

データベース操作用のSQL構文もたぶん本当は真面目に覚えた方がいいですが、割となんとかなります(一応データベースの操作はC#の範囲内でできるので)

さて、ぼくのように、Excelでのデータ管理を発展させるためになんとなくデータベースの使用を検討し始めた場合、どうしても「Excelのシートが大量に存在するのがデータベース」みたいな思考に陥りやすいですが、そこらへんの誤解を解いてくれたページを紹介します。(AccessExcelの比較ですが、Accessはデータベース管理ソフトなので話の方向性は大体合っています)

MS-Access2000超入門部屋--Excelとどう使い分けるか

 

個人的には、Excelは"ファイル"でありデータベースは"サーバー"であるという理解に落ち着きました。

後者はデータベースファイルを管理するための中枢となるサーバープロセスを立ち上げる必要がある、というのが大きな違いだと感じました。

だから例えばSQL Serverという"Server"の名のついたアプリケーションをインストールする必要があります。

 

インストール

MS信者の場合他の製品に付属していたりして既にインストールしてある場合もあるみたいです。一度ディスク内を検索してみましょう。SQL Server XXXX構成マネージャとかいうのが存在すればおそらく本体がインストールされています。

自分の環境では、Visual Studio 2013をインストールしたタイミングでSQL ServerのLocal DBコンポーネントがインストールされていたようです。たぶんこのパターンが多いと思います。

localdb

LocalDBはデータベースのファイルを取り扱うためだけのコンポーネントのようで、サーバーとしてのプロセスは立ち上げません。Visual Studio上からいじるだけならこれで用が足りると思いますが、

やはりサーバーとして接続できた方が複数のプログラムと連携できますし、SQL Server Management Studioという素晴らしいデータベースビューワーを使うためにもフルでインストールした方がいいです。

(レコードをちょっと確認するためにわざわざVisual Studio開くとかやってられない)

というわけでダウンロードはコ↑コ↓から

Download Microsoft® SQL Server® 2014 Express from Official Microsoft Download Center

 

予想以上にエディションが多いんで必要なものを選択する必要があります。

ページの下の方に説明が書いてあって結局よく分かりませんが、とりあえずExpress 64BIT\SQLEXPR_x64_JPN.exeをダウンロードしておけば困らないと思います。

インストール作業はこちらのページを参考にしました。(12.TCP/IPの有効化 まで)

SQL Server 2014 Express のインストール

 

インストールしたもののうち、よく使うものは以下の2つだと思います。

SQL Server 2014 構成マネージャ … サーバープロセスを管理する

SQL Server 2014 Management Studio … データベースの作成・閲覧

 

使い方を覚える

ぼくもそうでしたが、データベースそのものに初挑戦な人はまずサンプルを扱ってみないと何がなんだか分からなくて不安になるので、最初にサンプルデータベースをManagement Studioで閲覧するところから始めると心穏やかになると思います。

サンプル データベースの使用

【初級編③】Management Studio を使った SQL Server の基本的な操作方法(1/2) | SQLServer2008虎の巻

manage

 

コーディングに移りましょう。

検索しても、手とり足取り教えてくれてゴリラでも理解できるような解説ページはいまいち見つからなかったのですが、MSDNの公式ドキュメントが珍しく分かりやすいのでこれで勉強できるんですね。

Visual Studio + C# でデータベースを扱う方法ってたくさんあるんですが、今回はLINQ to SQLです。

LINQ to SQL [LINQ to SQL]

これの「チュートリアルによる学習」が丁寧で分かりやすいのでオススメです。

tuto

※注)このチュートリアル中、Management Studioは閉じておいてください(理由は後述)。

 

LINQ to SQL のリファレンスももちろん本当は真面目に読んだほうがいいですが、真面目じゃない人はwhereとselectさえ理解していればたぶん読まなくても大丈夫です(大丈夫とは言っていない)。

 

実際に使ってみる

実際にプログラムを作るときに気をつけることがありまして、何かというと、データベース接続部分を前のチュートリアル通りに記述するのはやめた方がいいです。

つまり、チュートリアルでは

Northwnd db = new Northwnd(@"c:\linqtest6\northwnd.mdf");

のようにデータベースファイルのファイルパスを渡してインスタンスを生成してますが、実はこの方法だとプログラムが.mdfファイルを専有してしまうので、プログラム実行中、もしくは終了後もManagement Studioでのデータベース閲覧ができなくなります(最悪、SQL Serverプロセスを再起動するまで「復旧待ち」と表示されアクセスできない)。

どうも、SQL Serverから切り離されたデータベースを単独のファイルとして読み込むための方法なんだそうです。

現在のかねのbotソースコードからそのままコピーしてきた一例ですが、次のように接続文字列と呼ばれるものを指定してインスタンスを生成すれば、きちんとSQL Serverへの接続となり他のプログラムとも同時接続できるようです。こちらの方がいいと思います。

var scsb = new SqlConnectionStringBuilder();
scsb.DataSource = "(ユーザー名)\\SQLEXPRESS";
scsb.AttachDBFilename = @"C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\KanenoBotDB.mdf";
scsb.IntegratedSecurity = true;
scsb.InitialCatalog = "KanenoBotDB";
var db = new KanenoBotDB(scsb.ConnectionString);

 

チュートリアルを通してデータベース操作に関連するクラスが大体分かってくるので、後は必要に応じてググっていけばそれなりのプログラムが書けると思います。(「必要に応じてググる」のが大切)

 

かねのbotの話がいつの間にかどこかへ行ってしまいましたが、今こんな感じでデータベース作ってます。

ウインドウに表示されているのはこの前の記事で解説した形態素リストですが、合計で約53万件のレコードの追加も10分程度で終わりました。

リレーションシップを設定することで関連する別テーブルを簡単に参照できるので、その点でもcsvファイルより格段に使い勝手がいいです。

management

 

最近は帰ってからこの作業とアイカツの視聴くらいしかしてない