VB のたまご

作成日: 2017/08/23, 更新日: 2017/08/23


SQL Server 2017 プレビュー版を、Ubuntu 17.04 にインストールする

  •  Ubuntu 17.04 に、SQL Server 2017 プレビュー版をインストールして、VB.NET からデータ取得するまでを共有したいと思います。 まだプレビュー版ですので、お試し環境で試すのが良いかと思います。SQL Server 2017 を【Linuxで使う】ためには、メモリが 3.5 GB 以上必要とのことです。

  •  私はすでに仮想環境上に Ubuntu 17.04 があるのですが、メモリ 2 GB で管理していたため、 「すべてをクローン」をして、メモリを 4 GB に変更して新たに環境を準備しました。 以下の参考リンクを見ると、インストール方法の他、アンインストール、無人インストール、オフラインインストールなどなど、 いろいろ書かれていて素晴らしいなと驚きました!

  •  ・環境
  •  ・Ubuntu 17.04
  •  ・.NET Core 2
  •  ・Mono 5
  •  ・SQL Server 2017 RC2

  •  参考
  • Microsoft Docs
    SQL Server をインストールし、Ubuntu でデータベースを作成
    https://docs.microsoft.com/ja-jp/sql/linux/quickstart-install-connect-ubuntu
    
    Microsoft Docs
    Linux 上の SQL Server のインストールのガイダンス / システム要件
    https://docs.microsoft.com/ja-jp/sql/linux/sql-server-linux-setup
    
    Microsoft Docs
    SQL Server Management Studio (SSMS) のダウンロード
    https://docs.microsoft.com/ja-jp/sql/ssms/download-sql-server-management-studio-ssms
    
    Qiita
    .NET Coreで幾つかのデータベースアクセスを試してみる(SQL Server編)
    http://qiita.com/zaburo/items/0a215f4d9fad0aa0b8ef
    


SQL Server 2017 プレビュー版のインストール

  •  本家のサイトそのままですが、端末を開いて、以下を入力します。

  •  リポジトリのキーをインポート
  • $ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    

  •  Microsoft SQL Server Ubuntu リポジトリを登録(★Ubuntu 16.04 用です)
  • $ sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/mssql-server.list)"
    

  •  apt のリストを更新、SQL Server をインストール
  • $ sudo apt-get update
    $ sudo apt-get install -y mssql-server
    

  •  私の環境では、900 MB くらいの容量がかかるとのことでした。 しばらく待ちます。

  •  SQL Server の設定のセットアップをおこないます。
  • $ sudo /opt/mssql/bin/mssql-conf setup
    

    ライセンス条項に同意しますか?[Yes/No]: yes
    エディションを入力してください(1-7): 3
    ※ 3 は Express Edition。各自の環境に合わせて選択してください。
    
    SQL Server の言語の選択:
    オプション 1-11 を入力: 6
    ※ 6 は日本語。各自の環境に合わせて選択してください。
    
    SQL Server システム管理者パスワードを入力してください: xxxxx
    SQL Server システム管理者パスワードを確認入力してください: xxxxx
    

  •  This is an evaluation version. There are [153] days left in the evaluation period.
  •  MS のサイトには 175 日間、評価できるよと書いてありましたが、2017/08/23 時点では、153 日間、評価できるらしいです。

  •  SQL Server のサービスが実行されているか確認
  • $ systemctl status mssql-server
    

  •  Active が active (running) と緑色で表示されていました!

  •  それと、ネットワーク越しにアクセスする場合は、ポートを開かないといけないのですが(ファイアウォールの設定)、ここでは扱いません。


SQL Server コマンドラインツールのインストール

  •  sqlcmd コマンドと bcp コマンドをインストールします。

  •  リポジトリ用のキーをインポート
  • $ curl https://packages.microsoft.com/keys/microsoft.asc | sudo apt-key add -
    

  •  Microsoft Ubuntu リポジトリを登録(★Ubuntu 16.04 用です)
  • $ sudo add-apt-repository "$(curl https://packages.microsoft.com/config/ubuntu/16.04/prod.list)"
    

  •  apt のリストを更新、コマンドラインツールと、unix 用 ODBC 系のパッケージをインストール
  • $ sudo apt-get update
    $ sudo apt-get install -y mssql-tools unixodbc-dev
    

    パッケージの設定(控え忘れました、すみません)
    ライセンスに同意しますか?的な文章
    <はい>を選択(左キー押して、エンターキー押す)
    
    ライセンスに同意しますか?的な文章2(msodbcsql)
    <はい>を選択(左キー押して、エンターキー押す)
    

  •  コマンドラインツールの環境変数への登録をします。 Windows と違って、ログインするタイミング、端末を開いたタイミングの2か所に登録して再読み込みします。
  • $ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bash_profile
    $ echo 'export PATH="$PATH:/opt/mssql-tools/bin"' >> ~/.bashrc
    $ source ~/.bashrc
    

  •  sqlcmd コマンド経由で SQL Server にアクセスできるか確認します。
  • $ sqlcmd -S localhost -U SA -P 'xxxxx'
    

  •  1> と表示されたら成功です!


データベース、テーブル、データの作成

  •  注意点として、入力した SQL 文は、入力後にエンターキーを押したタイミングで実行されるのではなく、 go コマンドを入力してエンターキーを押したタイミングで、今まで命令した SQL 文が実行されることに注意してください。

  •  DB を作成
  • > create database TestDB
    > go
    

  •  サーバ上の全ての DB を確認
  • > select Name from sys.Databases
    > go
    

  •  DB を選択(この中にテーブルを作りたいから)、テーブル作成とデータを登録します。
  • > use TestDB
    > create table Inventory (id int, name nvarchar(50), quantity int)
    > insert into Inventory values (1, 'banana', 150); insert into Inventory values (2, 'orange', 154);
    > go
    

  •  数量が 152 よりも大きいデータを取得
  • > select * from Inventory where 152 < quantity
    > go
    

  •  こういうのが表示されたら成功です!
  • id         lname                                              lquantity   
    -----------l--------------------------------------------------l-----------
              2lorange                                            l        154
    
    (1 rows affected)
    

  •  SQL Server のバージョンを確認します。
  • > select @@version
    > go
    

  •  例えば、以下のように表示されます。
  • Microsoft SQL Server 2017 (RC2) - 14.0.900.75 (X64) 
    	Jul 27 2017 08:53:49 
    	Copyright (C) 2017 Microsoft Corporation
    	Express Edition (64-bit) on Linux (Ubuntu 17.04)                                                                                                                                     
    
    (1 rows affected)
    

  •  対話から抜け出します。exit と入力して、対話から抜け出します。
  • > exit
    

  •  ちなみにですが、ssms ( SQL Server Management Studio ) は、Windows 系プラットフォームしかサポートしていないみたいで、 Windows on ssms から Linux にアクセスしながら管理する運用みたい?です。


VB.NET からアクセスする

  •  プロジェクトを作成して、Visual Studio Code を起動します。
  • $ dotnet new Console -o vbapp1 -lang VB
    $ cd vbapp1
    $ code .
    

  •  (実行しようとすると、1回目に構成を、2回目にタスクランナーを確認してくるのですが) 構成とタスクランナーは両方とも「.NET Core」にして、launch.json はテンプレートパスから実在するパスに書き換えます。

  •  launch.json
  • "program": "${workspaceRoot}/bin/Debug/netcoreapp2.0/vbapp1.dll",
    

  •  続いて、Program.vb を書き換えていくのですが、ここでは失敗してしまう手順を記載した後、成功する手順を記載します。 回りくどいことして、すみません。

  •  思いっきりソースコードのコメントに書いてしまっていますが、今は無視して、以下のように書き換えてください。

  •  Program.vb
  • Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    
    ' NuGet パッケージ経由で取得しないと?どこにもクラス定義されていないよ、という例外エラーが発生してしまう
    ' message: 'Type 'SqlConnection' is not defined.
    
    Module Program
    
        Sub Main(args As String())
    
            Dim conInfo = "Data Source=localhost;" &
                            "Initial Catalog=TestDB;" & 
                            "User Id=sa;" & 
                            "Password=xxx;"
            
            ' 接続
            Dim con = New SqlConnection()
            con.ConnectionString = conInfo
            con.Open()
    
            ' データ取得
            Dim cmd = con.CreateCommand()
            cmd.CommandText = "select * from Inventory"
    
            Dim reader = cmd.ExecuteReader()
            While reader.Read() = True
                
                Console.WriteLine($"id = {reader("id")}")
                Console.WriteLine($"name = {reader("name")}")
                Console.WriteLine($"quantity = {reader("quantity")}")
                Console.WriteLine("")
    
            End While
    
            ' 破棄
            reader.Dispose()
            cmd.Dispose()
            con.Dispose()
    
        End Sub
    
    End Module
    

  •  そしたら、実行します。実行すると、以下の例外エラーが飛んできます。
  • ' message: 'Type 'SqlConnection' is not defined.
    

  •  どうやら、標準ライブラリには含まれておらず、明示的にプロジェクトファイルに記載しないと使うことができないみたいです。 というわけで、プロジェクトファイルを開いて、追加します。

  •  vbapp1.vbproj
  • <Project Sdk="Microsoft.NET.Sdk">
    
      <PropertyGroup>
        <OutputType>Exe</OutputType>
        <TargetFramework>netcoreapp2.0</TargetFramework>
      </PropertyGroup>
    
      <!--
      SqlClient を NuGet パッケージで取得しないと?クラス定義されていないよと、以下の例外エラーが出てしまう
      message: 'Type 'SqlConnection' is not defined.
      -->
      <ItemGroup>
        <PackageReference Include="System.Data.SqlClient">
          <Version>*</Version>
        </PackageReference>
      </ItemGroup>
    
    </Project>
    

  •  プロジェクトファイルを書き換えたら関連データを取得してきます。端末に戻って、以下を実行します。
  • $ dotnet restore
    

  •  実行したら、Visual Studio Code に戻って、再度実行します。 今度はうまく実行できましたでしょうか?以下のように出力されたら成功です!
  • id = 1
    name = banana
    quantity = 150
    
    id = 2
    name = orange
    quantity = 154
    


ちなみに、Mono で動かす場合

  •  Mono 上でも確認しました。

  •  MonoDevelop と vbnc コンパイラを使っているのですが、なぜか .NET Framework 4.0 相当に下げないとビルドエラーになってしまう環境なので、 型推論が効かず、型を明記しないとビルドエラー、文字列中の直接挿入するとビルドエラーになってしまいましたので、 以下のように修正することで、Mono 上でも動作しました!

  •  Program.vb
  • Imports System
    Imports System.Data
    Imports System.Data.SqlClient
    
    Module Program
    
        Sub Main(args As String())
    
            Dim conInfo As String = "Data Source=localhost;" &
                                    "Initial Catalog=TestDB;" & 
                                    "User Id=sa;" & 
                                    "Password=xxx;"
            
            ' 接続
            Dim con As SqlConnection = New SqlConnection()
            con.ConnectionString = conInfo
            con.Open()
    
            ' データ取得
            Dim cmd As SqlCommand = con.CreateCommand()
            cmd.CommandText = "select * from Inventory"
    
            Dim reader As SqlDataReader = cmd.ExecuteReader()
            While reader.Read() = True
                
                Console.WriteLine("id = {0}", reader("id"))
                Console.WriteLine("name = {0}", reader("name"))
                Console.WriteLine("quantity = {0}", reader("quantity"))
                Console.WriteLine("")
    
            End While
    
            ' 破棄
            reader.Dispose()
            cmd.Dispose()
            con.Dispose()
    
        End Sub
    
    End Module
    


まとめ

  •  Linux ( Ubuntu ) で SQL Server の構築と VB.NET 言語でのアクセス確認を試しましたが、思ってた以上に簡単に導入できたし、 サクサク操作できましたね!

  •  また、今回は評価版なので、最上位クラスの Enterprise を選択しても良かったかなと後悔しました(^_^.)
  •  最後まで記事を読んでいただき、ありがとうございました。