Microsoft AccessからSQLServerへのシステムの移行調査の結果を備忘録として残します。
Microsoft Accessからテーブルを抽出
移行の方法にはいろいろありますが、初期調査の段階でテーブルを簡単に移行を行うには、Microsoft AccessとSQL Serverに付属する機能を利用をするのが手っ取り早いです。
Microsoft Accessにはテーブルだけではなく、フォームやレポートも組み込めるため、まずはMicrosoft Accessの機能を利用してテーブルのみを抽出したファイルを作成します。
テーブルの抽出は「データベースツール」の「Accessデータベース」-「データベース分割ツール]を使用してテーブルのみを別ファイルとして保存します。
保存したファイルは、おそらく「accdb」になっているかと思います。
「accdb」の形式ではSQL Server側でテーブルの取込みができないケースもありますので、保存した「accdb」のファイルを開いて、「mdb」の形式に保存しなおしてください。
SQL Serverへのテーブルの取込み
SQL Serverへのテーブルの取込みには「SQL Server Management Studio(SSMS)」を使用します。
移行先のデータベースをあらかじめ作成しておき、そのデータベースを右クリック→「タスク」-「データのインポート」でインポートのウィザードが開きます。
ウィザードでは、コピー元のデータソースで「Microsoft Access…」を指定してください。
その際、私の環境では対象の「Access」ファイルが「mdb」しか取りこめなかったようで、前述の作業にて「accdb」→「mdb」に変更しています。
以降はウィザードの手順に沿っていけばテーブルを取込めます。
SQL Serverを使用する際のプログラムの変更ポイント
今回しようした言語はVB.NETです。
以下に変更のポイントを挙げておきます。
インポートの置き換え
Microsoft.Office.Interop.AccessをSystem.Data.SqlClientに置き換えます。
Imports System.Data.SqlClient
接続オブジェクトの変更
接続オブジェクトをDao.DatabaseからSqlConnectionに変更します。
Private _conn As SqlConnection
SQL Serverへの接続
以下が接続例です。
Dim connectionString As String = "PC1\SQLEXPRESS;Database=newdatabase;Integrated Security=True;"
_conn = New SqlConnection(connectionString)
_conn.Open()
connectionStringにはSQL Serverインスタンスの名前(この場合はPC1\SQLEXPRESS)を指定し、Databaseには接続したいデータベースの名前を指定しています。
Integrated Security=TrueはWindows認証を使用することを意味します。
トランザクションの利用
トランザクションの利用は、以下のようにトランザクションオブジェクトを使用します。
'トランザクション オブジェクトの宣言
Private _tran As SqlTransaction
'トランザクション開始
_tran = _conn.BeginTransaction()
'コミット
_tran.Commit()
'ロールバック
_tran.Rollback()
SQLの実行オブジェクト
SQLの実行を行う際に使用されるオブジェクトは主に次のようなものがあります。
- SqlCommand:
- SQLクエリやストアドプロシージャを実行するために使用されます。
- SqlDataReader:
- SELECTクエリの結果を読み取るために使用されます。
- SqlDataAdapter:
- SQL ServerデータベースとDataSet、DataTabel間でデータのやり取りを行います。
1. SqlCommandの利用例
' SQLコマンドを作成します
Dim sql As String = "INSERT INTO テーブル名 (Column1, Column2) VALUES ('値1', '値2')"
' SqlCommand オブジェクトを作成し、SQLコマンドを実行します
Using command As New SqlCommand(sql, _conn)
Dim result As Integer = command.ExecuteNonQuery()
' result には処理を行った影響を受けた行数が返されます。
End Using
2. SqlDataReaderの利用例
' SQLコマンドを作成します
Dim sql As String = "SELECT Column1, Column2 FROM テーブル名"
' SqlCommand オブジェクトを作成し、SQLコマンドを実行します
Using command As New SqlCommand(sql, _conn)
' SqlDataReader を使用して、クエリの結果を読み取ります
Using reader As SqlDataReader = command.ExecuteReader()
' 結果セットを一行ずつ読み込みます
While reader.Read()
' Column1 と Column2 の値を取得します
Dim column1Value As String = reader("Column1").ToString()
Dim column2Value As String = reader("Column2").ToString()
End While
End Using
End Using
3. SqlDataAdapterの利用例
' SqlDataAdapter オブジェクトを作成します
Dim sql As String = "SELECT Column1, Column2 FROM テーブル名"
Using adapter As New SqlDataAdapter(sql, connectionString)
' 結果セットを格納するための DataTable を作成します
Dim table As New DataTable()
' SqlDataAdapterを使用して、結果セットを DataTable に格納します
adapter.Fill(table)
' DataTable の内容を表示します
For Each row As DataRow In table.Rows
Dim column1Value As String = row("Column1").ToString()
Dim column2Value As String = row("Column2").ToString()
Next
End Using
Microsoft AccessとSQL ServerでのSQLでの非互換
最後にMicrosoft AccessとSQL ServerでのSQL構文に関する主な非互換です。
主な非互換
1. データ型
Microsoft AccessとSQL Serverでは、データ型が異なる場合があります。たとえば、Microsoft AccessのText
型はSQL ServerのVARCHAR
に相当しますが、サイズ制限や挙動の違いがあります。
2. ワイルドカード
クエリにおけるワイルドカード文字は、Microsoft Accessでは*
や?
が使われますが、SQL Serverでは%
や_
が使われます。これは、LIKE演算子を使用する際の検索パターンで顕著です。
3. 関数
関数の名称や利用可能な関数が異なります。例えば、Microsoft AccessではMID関数が使えますが、SQL ServerではMID関数は利用できません(SUBSTRING関数を使用します)。
4. 予約語
一部の単語はMicrosoft Accessでは予約語ですが、SQL Serverではそうではない場合があります。その逆もまた真です。
5. クォーテーション
Microsoft Accessでは文字列リテラルにダブルクォーテーション(”`”)を使用しますが、SQL Serverではシングルクォーテーション(”‘”)が標準です。
最後に
この記事は、Microsoft AccessからSQL Serverへのシステム移行に関する移行調査の結果をまとめたものです。
同じようにMicrosoft AccessからSQL Serverへの移行を検討している開発者やデータベース管理者にとって有用な情報となれば幸いです。