【c#,vb】データベースを操作する方法

C#

C#.NET 及び VB.NETでデータベースを操作する方法を紹介します。
APIはOLE DBを使っています。
ここで紹介する方法はSQLServer、Accessに対して操作できることを確認しています。その他のデータベースに対して操作できることは確認しておりません。
ここで紹介する方法はあくまでも一例であり、他にも方法はあるかと思います。

Accessのデータベースファイルを操作するための準備

Accessのデータベースファイル(.accdb)を操作するためには、あらかじめMicrosoft Access データベース エンジン 2010 再頒布可能コンポーネントをインストールしておく必要があります。
インストールされていない場合は下記の記事を参照してインストールしてください。

「’Microsoft.ACE.OLEDB.12.0’プロバイダーはローカルのコンピューターに登録されていません。」の対処法

接続文字列

SQLServer、Accessそれぞれのデータベースを操作するための接続文字を紹介します。

Accessのデータベースファイルを操作するための接続文字

@"Provider=Microsoft.ACE.OLEDB.12.0;
Data Source={ここへデータベースファイルの絶対パス(拡張子は除く)を入力する}.accdb;" +
"Jet OLEDB:Database Password={パスワード};";//←パスワードを付けている場合には必要となります。パスワードがない場合には不要です。
"Provider=Microsoft.ACE.OLEDB.12.0;" & _
"Data Source={ここへデータベースファイルの絶対パス(拡張子は除く)を入力する}.accdb;" & _
"Jet OLEDB:Database Password={パスワード};"'←パスワードを付けている場合には必要となります。パスワードがない場合には不要です。

※exeファイルと同じ階層にある.accdbファイルを参照する仕様にする場合は、exeファイルがどのディレクトリにあるかを取得できるSystem.IO.Directory.GetCurrentDirectory()メソッドを使うと便利です。

SQLServerのデータベースファイルを操作するための接続文字

"Provider=SQLOLEDB;Data Source={インスタンス名を入力する}; Initial Catalog={データべース名を入力する(拡張子は不要)};Integrated Security={認証の種類を入力する。Windows認証の場合は"SSPI"でよい。};"

※VBの場合も上記と同じです。

SELECTの実行結果を取得する。

SQLのSELECT構文の結果を取得するには、System.Data.OleDb.OleDbCommand.ExecuteReader()メソッドを使えば良いです。

以下のサンプルでは、SELECT文の結果をSystem.Data.DataTableへ格納しています。

System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("{ここへ接続文字列を入力する}");
System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand("{ここへSQLを入力する}", cn);
System.Data.DataTable tb = new System.Data.DataTable();
cn.Open();

try
{
    tb.Load(Com.ExecuteReader());

    //取得結果のN行目1列目を参照する
    for (int i1 = 0; i1 < tb.Rows.Count; i1++)
    {
        tb.Rows[i1][0].ToString();
    }

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    cn.Close();
}
Dim cn As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection("{ここへ接続文字列を入力する}")
Dim Com As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand("{ここへSQLを入力する}", cn)
Dim tb As System.Data.DataTable = New System.Data.DataTable
cn.Open()

Try
    tb.Load(Com.ExecuteReader)

    '取得結果のN行目の"DataName"フィールドの値を参照する。
    Dim i2 As Long
    For i2 = 0 To tb.Rows.Count - 1
      tb.Rows(i2).Item("{ここへ列名を入力する}").ToString
    Next

Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    cn.Close()
End Try

UPDATE,INSERT,DELETEでデータベースを操作する。

SQLのUPDATE,INSERT,DELETE構文でテーブルの内容を変更する場合にはSystem.Data.OleDb.OleDbCommand.ExecuteNonQuery()メソッドを使えば良いです。
トランザクションも合わせて実装しておくべきかと思います。
以下のサンプルは、トランザクションを用いてデータベースを操作します。

List<string> sqlCommands = new List<string>();
sqlCommands.Add("{ここへ1文目のSQLを入力する}");
sqlCommands.Add("{ここへ2文目のSQLを入力する}");
sqlCommands.Add("{ここへ3文目のSQLを入力する}");

System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("{ここへ接続文字列を入力する}");
System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand();
Com.Connection = cn;

cn.Open();
Com.Transaction = cn.BeginTransaction();

try
{
    for (int i1 = 0; i1 < sqlCommands.Count; i1++)
    {
        Com.CommandText = sqlCommands[i1];
        Com.ExecuteNonQuery();
    }

    Com.Transaction.Commit();

}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
    Com.Transaction.Rollback();
}
finally
{
    cn.Close();
}
Dim sqlCommands As List(Of String) = New List(Of String)
sqlCommands.Add("{ここへ1文目のSQLを入力する}")
sqlCommands.Add("{ここへ2文目のSQLを入力する}")
sqlCommands.Add("{ここへ3文目のSQLを入力する}")

Dim cn As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection("{ここへ接続文字列を入力する}")
Dim Com As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand()
Com.Connection = cn

cn.Open()
Com.Transaction = cn.BeginTransaction

Try

    Dim i1 As Long
    For i1 = 0 To sqlCommands.Count - 1
        Com.CommandText = sqlCommands(i1)
        Com.ExecuteNonQuery()
    Next

    Com.Transaction.Commit()

Catch ex As Exception
    MessageBox.Show(ex.Message)
    Com.Transaction.Rollback()
Finally
    cn.Close()
End Try

集計関数の実行結果を取得する。

SQLの集計関数の結果を取得したい場合には、System.Data.OleDb.OleDbCommand.ExecuteScalar()を使えば良いかと思います。
SQLの結果の1行1列の値を取得できます。
以下サンプルです。変数”ob”にSQLの結果が格納されます。

System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection("{ここへ接続文字列を入力する}");
System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand("{ここへSQLを入力する}",cn);
Object ob;
cn.Open();

try
{
    ob = Com.ExecuteScalar();
}
catch (Exception ex)
{
    MessageBox.Show(ex.Message);
}
finally
{
    cn.Close();
}
Dim cn As System.Data.OleDb.OleDbConnection = New OleDb.OleDbConnection("{ここへ接続文字列を入力する}")
Dim Com As System.Data.OleDb.OleDbCommand = New OleDb.OleDbCommand("{ここへSQLを入力する}", cn)
Dim ob As Object
cn.Open()

Try
    ob = Com.ExecuteScalar
Catch ex As Exception
    MessageBox.Show(ex.Message)
Finally
    cn.Close()
End Try

データベースを操作するクラスを作りました。

上記で紹介した方法を用いてデータベースを操作するクラスを作ってみましたので紹介します。

おおまかな仕様

コンストラクター

OleDBCommand() インスタンスを初期化します。
OleDBCommand(string) 接続文字を指定してインスタンスを初期化します。

プロパティ

SqlConnect 接続文字を指定します。書き込み専用プロパティです。

メソッド

OleDBDataTable
  • 概要
    SELECTを扱うSQLを実行し、結果をDataTableへ格納します。
  • パラメーター
    sqlCommand:string型です。SELECTを扱うSQLを指定します。
  • 戻り値
    DataTable:実行したSQLの結果をDataTable型で返します。
OleDbExcuteNonQuery
  • 概要
    UPDATE,INSERT,DELETEを扱うSQLを実行し、成功可否を返します。
  • パラメーター
    sqlCommands:Listのstring型です。UPDATE,INSERT,DELETEを扱うSQLを指定します。1要素につき1つのSQLを指定できます。
  • 戻り値
    Boolean:SQLがエラーなく成功した場合はtrue、エラーが発生した場合はfalseを返します。
OleDBExcuteScalar
  • 概要
    集計関数などの実行結果が1行1列となるSQLを実行し、結果を返します。
  • パラメーター
    sqlCommand:string型です。集計関数などの実行結果が1行1列となるSQLを指定します。
  • 戻り値
    object:集計関数などの実行結果が1行1列となるSQLの実行結果を返します。

クラスの内容

using System;
using System.Collections.Generic;
using System.Data;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace DBConnect
{
    public class OleDBCommand
    {
        string _sqlConnect; //接続文字を格納します。

        /// <summary>
        /// インスタンス化を行います。
        /// </summary>
        public OleDBCommand()
        {

        }

        /// <summary>
        /// 接続文字を指定してインスタンス化を行います。
        /// </summary>
        public OleDBCommand(String sqlConnect)
        {
            _sqlConnect = sqlConnect;
        }

        /// <summary>
        /// 接続文字を格納します。
        /// </summary>
        //(WriteOnly Property)
        public string SqlConnect
        {
            set
            {
                _sqlConnect = value;
            }
        }

        /// <summary>
        /// SQLコマンドを実行し、実行結果を取得します。
        /// </summary>
        /// <param name="sqlCommand">実行するSQL文(SELECT文)</param>
        /// <returns></returns>
        public DataTable OleDBDataTable(string sqlCommand)
        {

            System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection(_sqlConnect);
            System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand(sqlCommand, cn);
            DataTable respTable = new DataTable();

            cn.Open();

            try
            {
                respTable.Load(Com.ExecuteReader());
                return respTable;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
            finally
            {
                cn.Close();
            }

        }

        /// <summary>
        /// SQLコマンドを実行します。
        /// </summary>
        /// <param name="sqlCommands">実行するSQL文(UPDATE,INSERT,DELETE文)</param>
        /// <returns>正常終了:=true,異常終了:=false</returns>
        public Boolean OleDbExcuteNonQuery(List<string> sqlCommands)
        {
            System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection(_sqlConnect);
            System.Data.OleDb.OleDbTransaction OleTran;
            System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand();
            Com.Connection = cn;

            cn.Open();
            OleTran = cn.BeginTransaction();
            Com.Transaction = OleTran;

            try
            {
                for (int i1 = 0; i1 < sqlCommands.Count; i1++)
                {
                    Com.CommandText = sqlCommands[i1];
                    Com.ExecuteNonQuery();
                }

                OleTran.Commit();
                return true;

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                OleTran.Rollback();
                return false;
            }
            finally
            {
                cn.Close();
            }

        }

        /// <summary>
        /// SQLコマンドを実行し、実行結果を1つだけ取得します。
        /// </summary>
        /// <param name="sqlCommand">実行結果が1行1列となるSQL文(集計関数等に有効)</param>
        /// <returns>実行結果(1つだけ返す。</returns>
        public object OleDBExcuteScalar(string sqlCommand)
        {
            System.Data.OleDb.OleDbConnection cn = new System.Data.OleDb.OleDbConnection(_sqlConnect);
            System.Data.OleDb.OleDbCommand Com = new System.Data.OleDb.OleDbCommand(sqlCommand,cn);
            Object RespObject;

            cn.Open();

            try
            {
                RespObject = Com.ExecuteScalar();
                return RespObject;
            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.Message);
                return null;
            }
            finally
            {
                cn.Close();
            }
        }
    }
}
Imports System.Windows.Forms

Public Class OleDBCommand

    Private _sqlConnect As String '接続文字を格納します。

    ''' <summary>
    ''' インスタンス化を行います。
    ''' </summary>
    Sub New()

    End Sub

    ''' <summary>
    ''' 接続文字を指定してインスタンス化します。
    ''' </summary>
    ''' <param name="sqlConnect">接続文字</param>
    ''' <remarks></remarks>
    Public Sub New(ByVal sqlConnect As String)
        _sqlConnect = sqlConnect
    End Sub

    ''' <summary>
    ''' 接続文字を格納します。
    ''' </summary>
    ''' <value></value>
    ''' <remarks></remarks>
    Public WriteOnly Property SqlConnect()
        Set(ByVal value)
            _sqlConnect = value
        End Set
    End Property

    ''' <summary>
    ''' SQLコマンドを実行し、実行結果を取得します。
    ''' </summary>
    ''' <param name="sqlCommand">実行するSQL文(SELECT文)</param>
    ''' <returns>実行結果</returns>
    ''' <remarks></remarks>
    Public Function OleDBDataTable(sqlCommand As String) As DataTable

        Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection(_sqlConnect)
        Dim Com As OleDb.OleDbCommand = New OleDb.OleDbCommand(sqlCommand, cn)
        Dim respTable As DataTable = New DataTable

        cn.Open()

        Try
            respTable.Load(Com.ExecuteReader)

            Return respTable

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return Nothing
        Finally
            cn.Close()
        End Try

    End Function

    ''' <summary>
    ''' SQLコマンドを実行します。
    ''' </summary>
    ''' <param name="sqlCommands">実行するSQL文(UPDATE又はDELETE文)</param>
    ''' <returns>実行件数</returns>
    ''' <remarks></remarks>
    Public Function OleDbExcuteNonQuery(sqlCommands As List(Of String)) As Boolean

        Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection(_sqlConnect)
        Dim OleTran As OleDb.OleDbTransaction
        Dim Com As OleDb.OleDbCommand = New OleDb.OleDbCommand()
        Com.Connection = cn

        cn.Open()
        OleTran = cn.BeginTransaction
        Com.Transaction = OleTran

        Try

            Dim i1 As Long
            For i1 = 0 To sqlCommands.Count - 1
                Com.CommandText = sqlCommands(i1)
                Com.ExecuteNonQuery()
            Next

            OleTran.Commit()
            Return True

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            OleTran.Rollback()
            Return False
        Finally
            cn.Close()
        End Try

    End Function

    ''' <summary>
    ''' SQLコマンドを実行し、実行結果を1つだけ取得します。
    ''' </summary>
    ''' <param name="sqlCommand">実行結果が1行1列となるSQL文(集計関数等に有効)</param>
    ''' <returns>実行結果(1つだけ返す)。</returns>
    ''' <remarks></remarks>
    Public Function OleDBExcuteScalar(sqlCommand As String) As Object

        Dim cn As OleDb.OleDbConnection = New OleDb.OleDbConnection(_sqlConnect)
        Dim Com As OleDb.OleDbCommand = New OleDb.OleDbCommand(sqlCommand, cn)
        Dim RespObject As Object

        cn.Open()

        Try
            RespObject = Com.ExecuteScalar
            Return RespObject

        Catch ex As Exception
            MessageBox.Show(ex.Message)
            Return Nothing
        Finally
            cn.Close()
        End Try

    End Function

End Class

クラスの操作方法

//インスタンス化する際に接続文字を入力する。
DBConnect.OleDBCommand Ref = new DBConnect.OleDBCommand(
    "{ここへ接続文字列を入力する}"
);

//OleDBDataTableメソッドの使用例
System.Data.DataTable ResultTable;
ResultTable = Ref.OleDBDataTable("{ここへSELECTを文を使うSQLを入力する}");
for(int i1 = 0; i1 < ResultTable.Rows.Count; i1++)
{
    ResultTable.Rows[i1][0].ToString();
}

//OleDBExcuteScalarメソッドの使用例
object ob;
ob = Ref.OleDBExcuteScalar("ここへ集計関数などの1行1列の結果になるSQLを入力する。");

//OleDbExcuteNonQueryメソッドの使用例
List<string> sql = new List<string>();
sql.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}");
sql.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}");
sql.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}");
Ref.OleDbExcuteNonQuery(sql);
'インスタンス化する際に接続文字を入力する。
Dim Ref As OleDBCommand = New OleDBCommand("{ここへ接続文字列を入力する}")

'OleDBDataTableメソッドの使用例
Dim tb As DataTable
tb = Ref.OleDBDataTable("{ここへSELECTを文を使うSQLを入力する}")

Dim i1 As Long
For i1 = 0 To tb.Rows.Count - 1
    tb.Rows(i1).Item("{ここへ列名を入力する}").ToString
Next

'OleDBExcuteScalarメソッドの使用例
Dim ob As Object
ob = Ref.OleDBExcuteScalar("ここへ集計関数などの1行1列の結果になるSQLを入力する。")

'OleDbExcuteNonQueryメソッドの使用例
Dim sqlCommands As List(Of String) = New List(Of String)
sqlCommands.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}")
sqlCommands.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}")
sqlCommands.Add("{ここへINSERTやUPDATTE、DELETEを文を使うSQLを入力する}")

Ref.OleDbExcuteNonQuery(sqlCommands)

以上となります。
参考になれば幸いです。

タイトルとURLをコピーしました