VB.netからさくらのレンタルサーバーにアクセスする方法

#はじめに
VB.netでSSH接続、ポートフォワーディングを行い接続する方法です。

VB.netの情報が少なくだいぶ遠回りをしてしまったため
需要があるかわかりませんが同じところで詰まる人がいた時のために記事にしようと思いました。

今年4月頃からプログラミングを始め、軽くHTMLやPHPの基本を勉強した程度で
個人開発中にVB.netに手を出したため効率の悪い書き方をしているかもしれません。

#接続方法
「MySql.Data」と「SSH.NET」が必要になるので参照から追加してください。
SSH.NETの方は「NuGetパッケージの管理」から参照の検索欄で「ssh」と検索すれば一番上に出てくると思います。
![sq.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912836/39ee8933-f4b1-cdf6-183e-8d9545598915.png)
![nuget ssh.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1912836/b381018a-b11e-2af5-0d65-a414e771ea3c.jpeg)

追加が完了したらコードの一番上にImportsを追加して
接続に必要な変数も作成していきます。

```vb
Imports MySql.Data.MySqlClient
Imports Renci.SshNet
-------------------------------
Dim con As New MySqlConnection
Dim connectionInfo As New PasswordConnectionInfo("sakuraIP", 22, "userName", "sakuraPW")
Dim client As New SshClient(connectionInfo)
Dim forward As New ForwardedPortLocal("127.0.0.1", 13306, "dbHost", 3306)

Dim Builder = New MySqlConnectionStringBuilder()
Builder.Server = "127.0.0.1"
Builder.Port = 13306
Builder.UserID = "userName"
Builder.Password = "dbPW"
Builder.Database = "dbName"
Builder.SslMode = MySqlSslMode.None
```
sakuraIP：さくらサーバーのIPv4アドレス（さくらコントロールパネルから確認可）
userName：hoge.sakura.ne.jpならhoge
sakuraPW：コントロールパネル接続時のパスワード
dbHost：mysql9999.db.sakura.ne.jp みたいなやつ
dbPW：データベース作成時に設定したパスワード
dbName：接続したいデータベース名
13306の部分は使用していないポートなら何でも大丈夫だと思います。

ここまで完了したら後は下記コードで接続、切断可能です。

```vb
'SSH接続
client.Connect()
'ポートフォワーディング
client.AddForwardedPort(forward)
forward.Start()
'sakuraDB接続
con.ConnectionString = Builder.ToString()
con.Open()

'切断
con.Close()
forward.Stop()
client.Disconnect()
```
これでVB.netからさくらのレンタルサーバーにアクセスして
SQL文を実行することができます。

#接続用クラス作成
クラス呼び出すだけで接続できます。
全コード

```vb
Imports MySql.Data.MySqlClient
Imports Renci.SshNet

Public Class SakuraServer
    Private con As New MySqlConnection
    Private connectionInfo As New PasswordConnectionInfo("sakuraIP", 22, "userName", "sakuraPW")
    Private client As New SshClient(connectionInfo)
    Private forward As New ForwardedPortLocal("127.0.0.1", 13306, "dbName", 3306)

    Private Function SakuraMysql() As String
        Dim Builder = New MySqlConnectionStringBuilder()
        Builder.Server = "127.0.0.1"
        Builder.Port = 13306
        Builder.UserID = "userName"
        Builder.Password = "dbPW"
        Builder.Database = "dbName"
        Builder.SslMode = MySqlSslMode.None
        Return Builder.ToString()
    End Function

    Public Sub New()
        Try
           '接続
            client.Connect()
            client.AddForwardedPort(forward)
            forward.Start()
            con.ConnectionString = SakuraMysql()
            con.Open()
        Catch ex As Exception
           '接続失敗時の処理
            Console.WriteLine(ex)
        End Try
    End Sub

    Public Sub close()
        con.Close()
        forward.Stop()
        client.Disconnect()
    End Sub

End Class
```
#使用例
userテーブルからユーザー名で絞り込んで削除を行う場合
接続用クラス内に下記コードを追加する。

```vb
    Public Sub deleteUser(a As String)
        Dim del As String = $"DELETE FROM user WHERE user_name = '{a}'"
        Dim delcommand As New MySqlCommand(del, con)
        delcommand.ExecuteNonQuery()
    End Sub
```
用意したDELETE文を実行したい場合は

```vb
'サーバー接続
Dim sakura As New SakuraServer
'DELETE文実行
sakura.deleteUser("ほげ太郎")
'切断
sakura.close()
```
こんな感じで使用できます。
今回のコードだとユーザー名「ほげ太郎」君を削除できます。

便利！

#参考記事
https://www.exceedsystem.net/2021/01/10/how-to-connect-mysql-workbench-to-sakura-server/

https://tos5511.hatenablog.com/entry/2019/03/07/021935